(изменено: Yuriy, 1 марта 2009г. 20:17:47)

Тема: Линия разреза. Как добавить дополнительные точки.

Достаточно часто при работе с извлеченными фасадами, разрезами возникает необходимость подкорректировать линию разреза.

Command: list
                  AEC_BDG_SECTIONLINE  Layer: "vsp-разрез-линия"
                            Space: Model space
                   Handle = e704

         Insertion : (150748.000, 153000.000, 0.000)
          Rotation : 0.00
            Normal : (0.000, 0.000, 1.000)
           Angle A : 0.00
           Angle B : 0.00
          Length A : 1609.000
          Length B : 1296.000
             Flags : UseModelExtentsForHeight
          Point at : (0.000, 0.000)
          Point at : (2253.000, 0.000)
          Point at : (2253.000, 140.000)
          Point at : (2779.000, 140.000)
          Point at : (2779.000, 313.000)
          Point at : (4926.000, 313.000)
              Name : Bldg Section Line (3)

Перемещение точек излома линии разреза или отдельных сегментов труда не составляет. А вот механизм добавления дополнительных точек похоже отсутствует.
Поэтому приходится переделывать и линию разреза и сам разрез заново перевыбирая ранее выбранные объекты.

Может есть какие-либо штатные средства или утилиты добавления-изъятия точек излома линии разреза?

(изменено: Yuriy, 14 марта 2009г. 06:21:48)

Re: Линия разреза. Как добавить дополнительные точки.

Удалять точки излома при помощи лиспа получилось   :)
А вот вставлять новые есть затруднения  :(

продолжение темы >>>

Re: Линия разреза. Как добавить дополнительные точки.

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

Re: Линия разреза. Как добавить дополнительные точки.

Алексей,

пример файла с линией разреза

на мыло тоже отправил

Re: Линия разреза. Как добавить дополнительные точки.

Yuriy, с корректным получением координат разобраться удалось:

(defun bdgsection-get-vertex (ent / pt_lst loc rot)
  ;; Получение координат вершин AecDbBdgSectionLine
  ;; Параметры вызова:
  ;; ent -> указатель на вхождение примитива AecDbBdgSectionLine
  ;; Примеры вызова:
  ;|
(setq lst (bdgsection-get-vertex(car(entsel))))
(mapcar '(lambda(x) (entmakex (list '(0 . "POINT")(cons 10 x) '(62 . 1)))) lst)
|;
  (if (and (setq ent (cond
                       ((= (type ent) 'vla-object) ent)
                       ((= (type ent) 'ename) (vlax-ename->vla-object ent))
                       ) ;_ end of cond
                 ) ;_ end of setq
           (= (vla-get-objectname ent) "AecDbBdgSectionLine")
           ) ;_ end of and
    (setq loc    (vlax-safearray->list (vlax-variant-value (vlax-get-property ent 'location)))
          rot    (vlax-get-property ent 'rotation)
          pt-lst (mapcar
                   (function
                     (lambda (x /)
                       (polar loc (+ rot (angle '(0. 0. 0.) x)) (distance x '(0. 0. 0.)))
                       ) ;_ end of lambda
                     ) ;_ end of function
                   (mapcar
                     (function cdr)
                     (vl-remove-if-not
                       (function
                         (lambda (x)
                           (and (= (car x) 10)
                                (not (equal (cdr x) loc 1e-9))
                                ) ;_ end of and
                           ) ;_ end of lambda
                         ) ;_ end of function
                       (entget (vlax-vla-object->ename ent))
                       ) ;_ end of vl-remove-if-not
                     ) ;_ end of mapcar
                   ) ;_ end of mapcar
          ) ;_ end of setq
    ) ;_ end of if
  pt-lst
  ) ;_ end of defun

Вариант удаления вершины:

(defun bdgsection-erase-vertex (ent vertex / pt-lst  near loc rot)
  ;; Удаление вершины AecDbBdgSectionLine
  ;; Параметры вызова:
  ;; ent    указатель на вхождение линии сечения
  ;; vertex    координаты удаляемой вершины. Вычисляется ближайшая к указанной координате
  ;; Примеры вызова:
  ;|
(bdgsection-erase-vertex (car (entsel "\nSelect section line: ")) (getpoint "\nSelect nearest vertex : "))
|;
  (if (setq pt-lst (bdgsection-get-vertex ent))
    (progn
      (setq near (car
                   (vl-sort pt-lst
                            (function
                              (lambda (a b)
                                (< (distance a vertex) (distance b vertex))
                                ) ;_ end of lambda
                              ) ;_ end of function
                            ) ;_ end of vl-sort
                   ) ;_ end of car
            ent  (cond
                   ((= (type ent) 'vla-object) ent)
                   ((= (type ent) 'ename) (vlax-ename->vla-object ent))
                   ) ;_ end of cond
            loc  (vlax-safearray->list (vlax-variant-value (vlax-get-property ent 'location)))
            rot  (vlax-get-property ent 'rotation)
            near (polar '(0. 0. 0.) (- rot (angle loc near)) (distance near loc))
            ent  (vlax-vla-object->ename ent)
            ) ;_ end of setq
      (entmod (vl-remove-if
                (function (lambda (x)
                            (and (= (car x) 10) (equal (cdr x) near 1e-6))
                            ) ;_ end of lambda
                          ) ;_ end of function
                (entget ent)
                ) ;_ end of vl-remove-if
              ) ;_ end of entmod
      (entupd ent)
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun

С добавлением в принципе все аналогично, но у меня что-то сейчас мозгов не хватило на вычисление ближайших координат вершин (имею в виду левую и правую координаты). Попробую завтра погонять, но ничего, к сожалению, гарантировать не могу :(
---
P.S. Важно! Код тестировался только в мировой системе координат! Попытка удаления первой вершины может привести к непредсказуемому результату!

Re: Линия разреза. Как добавить дополнительные точки.

Алексей, Спасибо! Доберусь до работы опробую...

Re: Линия разреза. Как добавить дополнительные точки.

C координатами все получилось.
добавил только преобразование в текущую UCS

(foreach xxx pt-lst  (trans xxx 0 1))

А вот функция удаления не всегда срабатывает.
Буду дальше разбираться.

(изменено: Кулик Алексей aka kpblc, 18 марта 2009г. 01:28:54)

Re: Линия разреза. Как добавить дополнительные точки.

Ну, чем мог...
---
Добавлено:
Попробуй постоянно преобразовывать координаты. У меня ощущение, что в 10-й группе координаты лежат в мировой системе, и потом преобразовываются в OCS. Соответственно (trans) придется применять везде где только можно. Самое главное - с направлением преобразования не ошибиться :)

Re: Линия разреза. Как добавить дополнительные точки.

При некоторых ПСК или если линия разреза не в плоскости WCS полученные координаты вершин не совпадают с оригиналом.
Или я не справился с trans  :(
Перебрал все сочетания с   0, 1, имяобъекта.
Может trans вообще нельзя применять к линии разреза.

обвести линию разреза любой ориентации и из любой ПСК смог при помощи

; обвести линию разреза
(defun c:test ( / _e _eg _10 _10s _15 _16 )
   (setq _e (car(entsel)))
   (setq _eg (entget _e))
   (setq _10 (vl-remove-if-not '(lambda (xxx) (= 10 (car xxx)))  _eg))
   (setq _10 (mapcar '(lambda (xxx)  (cdr xxx))  _10))
   (setq _10s (car _10)     _10  (cdr _10))
   (setq _15  (cdr(assoc 15 _eg)))
   (setq _16  (cdr(assoc 16 _eg)))
   (setq _15  (list (+ (car _10s)(car _15))   (+ (cadr _10s)(cadr _15))  (+ (caddr _10s)(caddr _15))))
   (setq _16  (list (+ (car _10s)(car _16)) (+ (cadr _10s)(cadr _16))  (+ (caddr _10s)(caddr _16)) ))
  (command "._ucs" "3"  _10s _15 _16 )
  (command "._3dpoly") (foreach xxx _10 (command xxx)) (command "")
  (command "._ucs" "_p")
(princ))

но как без command преобразовать список координат так и не знаю :(