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

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

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

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

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

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


Я бы искал блоки засечек/стрелочек и уже от них (с учетом угла поворота и др. параметров) искал бы связывающую линию и линии выноски, а по полученному расстоянию между засечками искал бы текст и его положение...
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,611


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

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

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


Для импорта из Теклы в 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,611


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,399


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


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


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
Сообщений: 87


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

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

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


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


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


Поменять засечки на блоки похоже можно при помощи кода из поста по ссылке 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,680


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
Сообщений: 361


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 вне форума  
 
Непрочитано 09.10.2017, 10:00
#21
Boxa

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


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

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


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


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


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
Сообщений: 87


Отлично, ждем с нетерпением, думаю не только я.
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
Сообщений: 87


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
Сообщений: 87


Цитата:
Сообщение от 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