| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Возможно ли восстановить взорванные размеры?

Возможно ли восстановить взорванные размеры?

Ответ
Поиск в этой теме
Непрочитано 05.10.2017, 15:50
Возможно ли восстановить взорванные размеры?
megabeton
 
Регистрация: 03.12.2009
Сообщений: 84

Доброго времени суток!
Задался тут вопросом: возможно ли восстановить взорванные размеры при помощи LISP или иных примочек к автокаду.
Т.е. чтобы некая программа (лисп, обвес к автокаду и пр.) распознавала набор примитивов в виде текста над линией с засечками на концах этой линии, и отбивала бы на этом месте автокадовский размер.
Понимаю все проблемы, такие как "к каким точкам привязываться, масштаб распознания и пр.", и вообще сомневаюсь в возможности автоматической простановки размеров в принципе, но все же, может кто придумает / подумает, в каком направлении хоть копать и как возможно сие реализовать.
Заранее спасибо откликнувшимся.
Просмотров: 6185
 
Непрочитано 09.10.2017, 10:00
#21
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Что тут еще можно обсудить? Два варианта обозначены, возможно кто-то предложит еще.
Я попробовал свою идею, у меня получилось, доводить до готового приложения нет ни времени ни желания.
Boxa на форуме  
 
Непрочитано 09.10.2017, 10:01
#22
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


А ничего, что выходные вообще-то были?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.10.2017, 11:29
#23
megabeton


 
Регистрация: 03.12.2009
Сообщений: 84


Setvar'у, всем откликнувшимся, спасибо большое! Код работает. В принципе, то что надо.
Боюсь спрашивать, Offtop: (уж больно в категоричной форме пользователи замечания делают, извините, если кого кросспостингом обидел)
но если вдруг кому не лень, можно как-то докрутить код, чтобы точки (ручки) привязок размеров отстреливали от линии, на которой цифра размера расположена (на какую-нибудь величину, на высоту текста, например).
В русифицированном автокаде это командой РЗМСМЕЩ делается (не знаю как в английской версии вызывается), но только в данном случает точки-ручки размера на месте остаются, там текст размера с линией смещаются.
А хорошо бы наоборот, чтобы текст с линией на месте остались.
И красиво вроде как, и править удобно.

Для себя еще попробую прикрутить к Вашему коду код из поста #14 (который AlexV выложил и Кулик Алексей aka kpblc подправил Offtop: [вроде всех указал, тьфу тьфу тьфу]), чтобы одной командой восстанавливать (как правило размеры все же взорваны до упора)
megabeton вне форума  
 
Непрочитано 09.10.2017, 11:41
#24
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


megabeton, сейчас у меня почти готова программа восстановления блоков засечек при полном расчленении размеров. Надеюсь только, что предыдущий пользователь не изменил все свойства объектов на "ByLayer" ("ПоСлою"), поскольку у меня в программе задействован как фильтр параметр "ByBlock".
Порядок действия представляется такой:
Сначала программно восстанавливаются блоки засечек (если они разбиты).
Потом вручную создается размерный стиль с нужными параметрами и делается текущим.
И, наконец, программно воссоздаются новые размеры на месте расчлененных.

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А ничего, что выходные вообще-то были?
Не хотелось мне, чтобы тема канула в вечность, вот и поднял ее. Тем более, что есть, что нового предложить.
Setvar вне форума  
 
Автор темы   Непрочитано 09.10.2017, 11:50
#25
megabeton


 
Регистрация: 03.12.2009
Сообщений: 84


Отлично, ждем с нетерпением, думаю не только я.
megabeton вне форума  
 
Непрочитано 09.10.2017, 16:22
1 | #26
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


В общем закончил. Но есть предварительные замечания.
Отрезки, полученные в результате расчленения блока "_Oblique" сортируются только по типу объекта, по слою и по значению DXF-кода 6 "ByBlock". По длине отрезка и по углу наклона не сортируются.
Вызвано это тем, что размер засечки в чертеже может не равняться размеру засечки в исходном блоке (размер засечки задается в конкретном размерном стиле). А угол наклона отрезка-засечки не равен 45 градусам для вертикальных размеров и наклонных. В случае отсутствия в чертеже блока засечек "_Oblique" создается временный размерный стиль для ввода этого блока в чертеж. Потом этот стиль удаляется.
Окончательный код программы:
Код:
[Выделить все]
;;; Восстановление засечек в полностью расчлененных размерах
(defun C:L-B ( / echo ent lay ssl cdim lenssl n lss entl 1p 2p bins)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq ent (car (entsel "\nВыберите любой элемент расчлененного размера: ")))
(if ent
    (progn
    (setq lay (vlax-get-property (vlax-ename->vla-object ent) 'Layer))
    (princ "\nТеперь выберите расчлененные (или все) размеры: ")
    (setq ssl (ssget (list (cons 0  "LINE") (cons 8 lay) (cons 6 "ByBlock"))))
    (if (= (tblsearch "BLOCK" "_Oblique") nil)
        (progn
        (setq cdim (getvar "DIMSTYLE"))      ; Текущий размерный стиль
        (setvar "DIMBLK" "_Oblique")         ; Назначение блока засечки
        (vl-cmdf "_-DIMSTYLE" "_S" "Temp")   ; Временный размерный стиль
        (vl-cmdf "_DIMSTYLE" "_R" cdim)      ; Восстановление текщего размерного стиля
        (vl-cmdf "_-PURGE" "_D" "Temp" "_N") ; Удаление временного размерного стиля
        ) ; progn
    ) ; if
    (if ssl
        (progn
        (setq lenssl (sslength ssl) n 0 lss nil lss (ssadd))
        (repeat lenssl
            (setq entl (ssname ssl n))
            (setq ugol (/ (* 180 (vlax-get-property (vlax-ename->vla-object entl) 'Angle)) pi))
            (setq 1p (cdr (assoc 10 (entget entl))))
            (setq 2p (cdr (assoc 11 (entget entl))))
            (setq bins (list (/ (+ (nth 0 1p) (nth 0 2p)) 2) (/ (+ (nth 1 1p) (nth 1 2p)) 2)))
            (vl-cmdf "_-INSERT" "_Oblique" bins "1" "" "0")
            (ssadd (entlast) lss)
            (vl-cmdf "_ERASE" entl "")
            (setq n (+ n 1))
        ) ; repeat
        ) ; progn
    ) ; if
    (sssetfirst lss lss)
    ) ; progn
    (princ "\nОбъект не выбран.")
) ; if
(setvar "CMDECHO" echo)
(princ)
)
Теперь надо создать реальный размерный стиль и установить его текущим. Или сделать текущим имеющийся в чертеже подходящий размерный стиль.
После этого запускается программа восстановления расчлененных размеров. Окончательный программный код:
Код:
[Выделить все]
;;; Восстановление нескольких размеров (при условии сохраненных блоков засечек).
;;; Размеры могут быть горизонтальными, вертикальными и наклонными.
(defun C:EXPD ( / ssd lssd obj n inss linss lnss llnss ins1 ins2)
(setq ssd (ssget) lssd (sslength ssd) n 0 inss nil inss (ssadd))
(repeat lssd
    (setq obj (ssname ssd n))
    (if (/= (cdr (assoc 0 (entget obj))) "DIMENSION")
        (ssadd obj inss)
    ) ; if
    (setq n (+ n 1))
) ; repeat
(setq linss (sslength inss) n 0 lnss nil lnss (ssadd))
(repeat linss
    (setq obj (ssname inss n))
    (if (= (cdr (assoc 0 (entget obj))) "INSERT")
        (ssadd obj lnss)
    ) ; if
    (setq n (+ n 1))
) ; repeat
(setq llnss (sslength lnss) n 0)
(repeat (/ llnss 2)
    (setq ins1 (cdr (assoc 10 (entget (ssname lnss n)))))
    (setq ins2 (cdr (assoc 10 (entget (ssname lnss (+ n 1))))))
    (if (or (= (nth 0 ins1) (nth 0 ins2)) (= (nth 1 ins1) (nth 1 ins2)))
        (vl-cmdf "_dimlinear" ins1 ins2 ins1)
    ) ; if
    (if (and (/= (nth 0 ins1) (nth 0 ins2)) (/= (nth 1 ins1) (nth 1 ins2)))
        (vl-cmdf "_dimaligned" ins1 ins2 ins1)
    ) ; if
    (setq n (+ n 2))
) ; repeat
(vl-cmdf "_ERASE" inss "")
(princ)
)
Setvar вне форума  
 
Автор темы   Непрочитано 09.10.2017, 19:50
#27
megabeton


 
Регистрация: 03.12.2009
Сообщений: 84


Setvar, протестировал. Привожу результаты.

В академических условиях (на чертеже имеются только что [мною] начерченные и взорванные [до упора] размеры, и больше ничего) - коды работают идеально.

В условиях реального боя случаются нюансы, связанные [видимо] с ограничениями по свойствам отрезков засечек - не всегда распознаются остатки засечек.

При попытке руками заменить засечки-отрезки на блоки-отрезки как правило получаю удивительную мозаику параллельных размеров по всему чертежу.

При попытке восстановить руками нарисованный (не взорванный, а именно нарисованный) размер, состоящий из отрезков и текста - засечки не распознаются и не превращаются в блоки (понимаю, что это связано с описанными ограничениями по свойствам объектов).
И вот тут реальная проблема, т.к. большинство "разобранных" размеров приходит в автокад из сторонних приложений в виде отрезков и текстов с потерей всевозможных свойств / атрибутов.

Очень, конечно, хочется, что бы код "оптически" так сказать, распознавал на чертеже набор объектов из текста, отрезка под ним и с засечками на концах.
Т.е. как-то последовательно проделать нечто следующее:
- поиск на чертеже отрезков, которые пересекаются с другими отрезками;
- последовательная проверка на определенном расстоянии [задаваемым пользователем] от центров отрезков (пусть будет сверху и слева) наличия текста;
- сопоставление найденного текста числовому значения, дабы отсечь иные возможные надписи на чертеже (может умножением на 1, не знаю как это проделать, но думаю решаемо, некритичный фильтр)
- вставка в местах пересечений отрезков, соответствующих критериям, блоков-засечек (но вот как ориентировать блоки?.. прямо беда-беда... как-то по тексту ориентироваться?.. мда... сложно...)
- далее отбивка размеров по уже приведенному коду (видимо будет таки большой шанс получить удивительную мозаику параллельных размеров)

И да, при восстановлении размеров имеющимся кодом жестко удаляется все что попало в выбор. Это, конечно, нужно иметь ввиду, а в идеале желательно научить программу игнорировать объекты, не относящиеся к размерам (мда, круто я загнул).
Может есть смысл создать разновидность кода, отбивающего размеры поверх имеющихся объектов без их удаления, т.к. по факту [мне] проще руками загнать вновь отбитые размеры в отдельный слой, отключить его и почистить чертеж от разбитых размеров.


Еще раз СПАСИБО за проделанную работу!
megabeton вне форума  
 
Непрочитано 09.10.2017, 20:17
#28
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Отвечаю.
Программы, приведенные здесь, предназначены для ограниченного применения, а именно для случая, когда размеры было аккуратно проставлены средствами AutoCAD'а и расчленены в самом AutoCAD'е. Предполагается, что никакие другие операции (перенос всех объектов на один слой, присвоение всем объектам свойств "ByLayer" и т.п.) не выполнялись. Для разработки более продвинутых программ у меня "кишка тонка". Более того, я признаюсь, что и за эти программы я взялся, в значительной степени преследуя собственные интересы. Подобные случаи с разбитыми размерами и у меня случались, но как-то и в голову не приходило восстанавливать эти размеры, тем более, что часто файлы с такими размерами использовались просто в качестве подложки. Сейчас я думаю, что мне надо вспомнить поговорку о том, что "лучшее - враг хорошего" и остановиться на этом. Возможно, кто-нибудь и сделает лучшие варианты, но я пас.
Чтобы сохранить старые объекты от разбитых размеров, можно закоментарить во второй программе строку с командой "_ERASE" вот таким образом:
Код:
[Выделить все]
;(vl-cmdf "_ERASE" inss "")
т.е. приписать в начале строки точку с запятой.
Setvar вне форума  
 
Автор темы   Непрочитано 09.10.2017, 20:40
#29
megabeton


 
Регистрация: 03.12.2009
Сообщений: 84


Цитата:
Сообщение от Setvar Посмотреть сообщение
лучшее - враг хорошего
Согласен полностью. Того, что уже сделано, хватает за глаза.
А хотелки, это на будущее, вдруг кому еще будет интересно допилить код.
Еще раз спасибо.
megabeton вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Возможно ли восстановить взорванные размеры?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Монолитная ж.б. плита перекрытия жилого этажа с консольными вылетами по периметру на высоте более 40 м. Возможно ли выполнить? Julianna Железобетонные конструкции 45 02.10.2016 11:27
Inventor. Возможно ли переназначить горячие клавиши и орбиту/зум/панорамирование по принципу Solidworks? voverrr Прочее ПО от Autodesk 1 22.05.2015 07:03
Как узнать какие размеры на чертеже перебиты? dimandgy AutoCAD 4 20.10.2014 09:37
Автоматизированное проектирование. Возможно ли? Gurtik AutoCAD 18 03.09.2014 10:13
Глобально задать стили возможно? Marv AutoCAD 9 24.06.2009 11:08