Загрузка данных


(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)
)