(defun c:broff ( / sset i ent obj width dist res1 res2 obj-list doc filtered-count )
(vl-load-com)
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
;; 1. Захватываем только линейные объекты из текущего выделения
(if (setq sset (ssget "_I" '((0 . "LINE,LWPOLYLINE,POLYLINE,ARC,SPLINE,ELLIPSE"))))
(progn
(vla-StartUndoMark doc)
(setq i 0
filtered-count 0) ; Счетчик фактически обработанных широких линий
(while (< i (sslength sset))
(setq ent (ssname sset i)
obj (vlax-ename->vla-object ent)
width 0.0)
;; 2. Проверяем наличие свойства глобальной ширины
(if (vlax-property-available-p obj 'ConstantWidth)
(setq width (vla-get-ConstantWidth obj))
)
;; 3. ИГНОРИРУЕМ ОБЪЕКТ, если его ширина равна 0 (или это обычная линия LINE)
(if (> width 0.0)
(progn
(setq dist (/ width 2.0) ; Расчет дистанции смещения
obj-list nil)
;; 4. Безопасное смещение в обе стороны
(setq res1 (vl-catch-all-apply 'vla-offset (list obj dist))
res2 (vl-catch-all-apply 'vla-offset (list obj (- dist))))
;; Собираем все созданные объекты в один список
(foreach res (list res1 res2)
(if (and res (not (vl-catch-all-error-p res)))
(setq obj-list (append obj-list (vlax-safearray->list (vlax-variant-value res))))
)
)
;; 5. Пакетная настройка свойств для всех созданных элементов
(if obj-list
(progn
(foreach o obj-list
(vl-catch-all-apply 'vla-put-Linetype (list o "ByLayer"))
(if (vlax-property-available-p o 'ConstantWidth)
(vla-put-ConstantWidth o 0.0)
)
)
(setq filtered-count (1+ filtered-count)) ; Увеличиваем счетчик обработанных
)
)
)
)
(setq i (1+ i))
)
(vla-EndUndoMark doc)
(princ (strcat "\n[Готово] Созданы подобия для широких линий: " (itoa filtered-count) " шт."))
)
(princ "\n[Внимание] Выделите объекты, затем введите OFF2.")
)
(princ)
)