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

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

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

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

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

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


Я бы искал блоки засечек/стрелочек и уже от них (с учетом угла поворота и др. параметров) искал бы связывающую линию и линии выноски, а по полученному расстоянию между засечками искал бы текст и его положение...
Boxa вне форума  
 
Непрочитано 05.10.2017, 16:08
#3
Bull

Конструктор по сути (машиностроитель)
 
Регистрация: 10.10.2005
Набережные Челны (это где КамАЗ)
Сообщений: 11,391


Offtop: Люди взрывают, чтобы недобросовестные заказчики пользоваться нормально не могли, а заказчики ищут лекарство от этого на форуме исполнителей
__________________
Век живи, век учись - ...
Bull вне форума  
 
Непрочитано 05.10.2017, 16:35
#4
Boxa

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


Возможно этот пост написал бедолага, которому в руки по наследству достались такие файлы и работать с ними как то надо. Мне такое прилетало, работать с таким г-ом это боль.
Тут еще идейка пришла. Найдя засечку, можно искать объекты размера по хендлу... они должны быть последовательными...
Сумбурно объяснил, но думаю направление мысли понятно.

Хорошая задачка, интересная.
Boxa вне форума  
 
Непрочитано 05.10.2017, 16:40
#5
Кореш

Самоходная нейросеть
 
Регистрация: 12.12.2007
Питер
Сообщений: 1,195


Для импорта из Теклы в DWG она бы, кстати, пригодилась.
Кореш вне форума  
 
Непрочитано 05.10.2017, 16:56
#6
Setvar


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


Исправление одиночного перебитого размера при условии, что размер не расчленен.
Код:
[Выделить все]
(defun C:OVERD ( / obj dm)
(setq obj (entsel "\nВыберите размер: "))
(if (and obj (= (cdr (assoc 0 (entget (car obj)))) "DIMENSION"))
    (progn
    (if (/= (vlax-get-property (setq dm (vlax-ename->vla-object (car obj))) 'TextOverride) "")
        (vlax-put-property dm 'TextOverride "")
        (princ "\nЭто нормальный размер.")
    ) ; if
    ) ; progn
    (princ "\nОбъект не выбран.")
) ; if
(princ)
)
Если объект-размер расчленен вплоть до блоков стрелок (засечек), то задача сильно усложняется.

Последний раз редактировалось Setvar, 05.10.2017 в 17:02.
Setvar вне форума  
 
Непрочитано 05.10.2017, 16:58
#7
Boxa

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


Setvar, Вы перепутали взорванный и перебитый размер.
Boxa вне форума  
 
Непрочитано 05.10.2017, 18:05
#8
Setvar


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


Да, я знаю. Постепенно нащупываю решение.
Восстановление расчлененного размера (при условии сохраненных блоков стрелок).
Код:
[Выделить все]
(defun C:EXPD ( / ssd lssd obj n inss 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))) "INSERT")
            (ssadd obj inss)
        ) ; if
       (setq n (+ n 1))
) ; repeat            
(setq ins1 (cdr (assoc 10 (entget (ssname inss 0)))))
(setq ins2 (cdr (assoc 10 (entget (ssname inss 1)))))
(vl-cmdf "_dimlinear" ins1 ins2 ins1)
(vl-cmdf "_ERASE" ssd "")
(princ)
)
Можно выбрать рамкой текст, линию под текстом и стрелки (засечки). Программа простейшая, ассоциативность не создает.
Setvar вне форума  
 
Непрочитано 05.10.2017, 20:29
#9
Дмитррр

НЛО
 
Регистрация: 09.07.2007
Тутошние мы.
Сообщений: 6,081


Цитата:
Сообщение от Bull Посмотреть сообщение
Люди взрывают, чтобы недобросовестные заказчики пользоваться нормально не могли
Offtop: Хмм... А что-то в этом есть)
Дмитррр на форуме  
 
Автор темы   Непрочитано 06.10.2017, 10:17
#10
megabeton


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


Setvar, спасибо большое!
Код с поста #8 шикарен! Можно сказать бОльшая часть задачи решена.
Встречный вопрос (признаюсь, не силен в лисп программировании) - возможна ли множественная отбивка размеров?
Сейчас выбираю несколько [недо] разбитых размеров -> запускаю лисп -> на выходе отбивается только один верхний размер.

В принципе с полностью разбитыми размерами все решаемо - через быстрый выбор заменил отрезки-засечки (они как правило на чертеже все одного размера и под углом 45° и 135°) на блоки - и лисп их уже распознает как остатки размеров.

P.S. Надо будет подумать, как автоматизировать отбивку блоков на месте отрезков-засечек.
megabeton вне форума  
 
Непрочитано 06.10.2017, 10:31
#11
Setvar


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


Цитата:
Сообщение от megabeton Посмотреть сообщение
возможна ли множественная отбивка размеров?
Вот тут загвоздка. Когда мы выбираем 1 "размер", то фактически ясно, между какими точками строить новый размер, поскольку этих точек всего 2. В случае множественного выбора расчлененных размеров появляется неопределенность в попарном соответствии точек. Пока я не могу придумать приемы установки критериев соответствия точек.
Замену отрезков на блоки-засечки, я думаю, можно автоматизировать. Но есть еще проблемы:
1. Стрелки (а не засечки). Там не блоки, а фигуры.
2. Наклонные размеры. В этом случае надо применять команду "_dimaligned", а не "_dimlinear". Следовательно, надо проверять точки вставки блоков на неравенство координат по X или по Y.
Setvar вне форума  
 
Автор темы   Непрочитано 06.10.2017, 12:49
#12
megabeton


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


В качестве наводки. Может попробовать задать условие, при котором отбивка размеров происходила только при наличии между блоками текста-цифры, расположенного строго по центру между точками. Понимаю, что не все тексты размеров бывают строго по центру, но все же (может люфт какой задать?) это было бы очень большим шагом вперед.

Про наклонные размеры - частности. Если их много - задачу [думаю] можно будет решать путем ручной смены ПСК (UPD: попробовал - не решает, увы - размеры улетают в далекие дали).
megabeton вне форума  
 
Непрочитано 06.10.2017, 13:08
#13
AlexCondor

инженер
 
Регистрация: 03.08.2007
Сообщений: 1,326


Ассоциативные размеры, в первую очередь, хороши тем, что они привязаны к конкретным примитивам чертежа. Вычислить точки привязки уже расчлененных размеров, я думаю та еще задача. Без ИИ не обойтись
AlexCondor вне форума  
 
Автор темы   Непрочитано 06.10.2017, 13:47
#14
megabeton


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


Поменять засечки на блоки похоже можно при помощи кода из поста по ссылке http://forum.dwg.ru/showpost.php?p=1...postcount=3398
megabeton вне форума  
 
Непрочитано 06.10.2017, 15:36
#15
Setvar


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


megabeton, я вижу, что ты обратился в более профессиональную ветку. Значит, я могу "умыть руки".
Setvar вне форума  
 
Непрочитано 06.10.2017, 19:33
#16
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Setvar, он больше так не будет. Да же, megabeton?
Мне нравится идея Вохи. Добавлю толику своих размышлений. Получается, в коде мы должны тем же ssget'ом собрать все эти объекты, исключив лишние, "нащупать" первый попавшийся блок стрелки и анализировать, что было создано после него по порядковому номеру примитива в базе. Только пока неясно, как выяснить, первая ли это стрелка или заключительная. Предварительно надо разобраться, в какой последовательности создаются эти объекты при взрыве размера. Думаю, что первой создается стрелка, потом линия, текст, и опять стрелка (все это условно, для примера - там будет больше объектов, и это - только предположение, выяснить предлагается megabeton'у). Так вот, если после стрелки идет линия, значит это стрелка первая, если идет еще одна стрелка, то она вторая. Все, что между первой и второй стрелками - и есть нужное. Все это дело мы собираем в новый набор, удаляем, предварительно запомнив точки, по которым построим размер. И так в цикле, пока не кончатся блоки стрелок в чертеже. И еще интересно мне, в набор объекты добавляются в том же порядке, что создавались? Вероятнее всего да. Тогда первая попавшаяся в наборе стрелка (при условии, что начало обработки будет задано с верной стороны) будет первой, за ней должны будут последовать очередные объекты бывшего размера.
skkkk вне форума  
 
Непрочитано 06.10.2017, 20:06
#17
Setvar


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


Так, возвращаемся опять в эту тему.
Новая проба:
Код:
[Выделить все]
;;; Восстановление нескольких размеров (при условии сохраненных блоков засечек).
;;; Выполнять отдельно для горизонтальных и вертикальных размеров
(defun C:EXPD ( / ssd lssd obj n inss linss 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))) "INSERT")
        (ssadd obj inss)
    ) ; if
    (setq n (+ n 1))
) ; repeat
(setq linss (sslength inss) n 0)
(repeat (/ linss 2)
    (setq ins1 (cdr (assoc 10 (entget (ssname inss n)))))
    (setq ins2 (cdr (assoc 10 (entget (ssname inss (+ n 1))))))
    (vl-cmdf "_dimlinear" ins1 ins2 ins1)
    (setq n (+ n 2))
) ; repeat
(vl-cmdf "_ERASE" ssd "")
(princ)
)
Судя по всему, программа срабатывает, даже если одновременно выбрать и горизонтальные, и вертикальные размеры.
Напоминаю, что это фактически заготовка для реальной программы, без всяких проверок наличия отсутствия.

Последний раз редактировалось Setvar, 06.10.2017 в 20:36. Причина: Уточнение
Setvar вне форума  
 
Непрочитано 06.10.2017, 21:16
#18
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 359


Setvar, макрос из #17 просто удаляет весь расчленённый размер не восстанавливая его. В модели - пусто.
MrBrown вне форума  
 
Непрочитано 06.10.2017, 21:42
#19
Setvar


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


А вот это зачем написано?
Цитата:
;;; Восстановление нескольких размеров (при условии сохраненных блоков засечек).
Возможно у вас просто нет никаких блоков засечек.
На этот счет еще цитата:
Цитата:
Напоминаю, что это фактически заготовка для реальной программы, без всяких проверок наличия отсутствия.
----- добавлено через ~9 ч. -----
Еще проба.
Код:
[Выделить все]
;;; Восстановление нескольких расчлененных размеров (ПРИ НАЛИЧИИ СОХРАНЕННЫХ БЛОКОВ ЗАСЕЧЕК).
;;; Размеры могут быть горизонтальными, вертикальными и наклонными.
(defun C:EXPD ( / ssd lssd obj n inss linss 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))) "INSERT")
        (ssadd obj inss)
    ) ; if
    (setq n (+ n 1))
) ; repeat
(setq linss (sslength inss) n 0)
(repeat (/ linss 2)
    (setq ins1 (cdr (assoc 10 (entget (ssname inss n)))))
    (setq ins2 (cdr (assoc 10 (entget (ssname inss (+ 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" ssd "")
(princ)
)
Setvar вне форума  
 
Непрочитано 09.10.2017, 09:44
#20
Setvar


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


Автор темы куда-то пропал. Обиделся?
Boxa и skkkk тоже молчат. Видимо, мой код слишком примитивен. Получается, что заинтересованных лиц нет. И нет смысла выкладывать мои последующие разработки...
Setvar вне форума  
Ответ
Вернуться   Форум 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