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

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

Как вытащить имя полилинии из блока с атрибутами

Ответ
Поиск в этой теме
Непрочитано 09.03.2012, 11:02 #1
Как вытащить имя полилинии из блока с атрибутами
wluk1958
 
Регистрация: 26.11.2010
Сообщений: 45

Подмогните, пожалуйста (что-то заклинило): есть блок, содержащий полилинию и атрибуты. Как вытащить имя полилинии ? Спасибо.
Просмотров: 4283
 
Непрочитано 09.03.2012, 11:29
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


А что в Вашем понимании "имя полилинии"?
з.ы. ну и заодно "блок" это вхождение блока или описание?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.03.2012, 11:54
#3
wluk1958


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


По азбуке создания блока с атрибутами:
1. создаем атрибуты
2. создаем блок, выбирая необходимый примитив (полилинию, КОТОРАЯ ИМЕЕТ СВОЕ ИМЯ) и созданные атрибуты

Так задача в следующем: как программно, выбирая блок (car(entsel)) , определить имя полилинии, входящей в этот блок с атрибутами
wluk1958 вне форума  
 
Непрочитано 09.03.2012, 12:17
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


nentsel
gomer вне форума  
 
Непрочитано 09.03.2012, 12:26
#5
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Offtop: Покажите мне ту азбуку создания блоков где полилинии имеют ИМЕНА.
По сути вопроса - если не владеете терминологией - прикладывайте рисунки. А еще лучше (для Вас же) напишите для чего Вам "имя полилинии в блоке с аттрибутами".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.03.2012, 12:58
#6
wluk1958


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


Для вычисления стартоваой и конечной точек полилинии

Попробовл :
(SETQ #NEW(NENTSEL))
(SETQ A1(CAR #NEW))
(SETQ VLA1(VLAX-ENAME->VLA-OBJECT A1))
(SETQ START10(VLAX-CURVE-GETSTARTPOINT VLA1))
(SETQ END10(VLAX-CURVE-GETENDPOINT VLA1))

Абсолютно НЕ ТО

Последний раз редактировалось wluk1958, 09.03.2012 в 13:26.
wluk1958 вне форума  
 
Непрочитано 09.03.2012, 22:32
#7
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(vl-load-com)

(defun test (/ blk res)
  (if (and (= (type (setq blk (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (car (entsel "\nВыберите блок <Отмена> : ")
                                         ) ;_ end of car
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget blk))) "INSERT")
           ) ;_ end of and
    (progn
      (setq blk (vlax-ename->vla-object blk))
      (vlax-for ent (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                              (cond
                                ((vlax-property-available-p blk 'effectivename) (vla-get-effectivename blk))
                                (t (vla-get-name blk))
                                ) ;_ end of cond
                              ) ;_ end of vla-item
        (if (= (strcase (vla-get-objectname ent)) "ACDBPOLYLINE")
          (setq res (cons
                      (list (vlax-curve-getstartpoint ent) (vlax-curve-getendpoint ent))
                      res
                      ) ;_ end of cons
                ) ;_ end of setq
          ) ;_ end of if
        ) ;_ end of vlax-for
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.03.2012, 23:07
#8
wluk1958


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


Спасибо. Но, к сожалению, ф-я действует только на блоки без атрибутов (возвращает к-ты стартовой и конечной точек). С атрибутами - совершенно непредсказуемо. К тому же, по большому счету, хотелось бы иметь на выходе имя цельной полилинии или список ее вершин, чтобы определять и параметры предыдущих вершин...
wluk1958 вне форума  
 
Непрочитано 09.03.2012, 23:41
#9
Кулик Алексей aka kpblc
Moderator

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


У полилинии имени нет. У нее есть имя объекта (в ActiveX-модели - AcDbPolyline; в ename-представлении - LWPOLYLINE). У нее есть т.н. Handle (уникальный идентификатор).
Имя есть у слоя, у текстового, размерного и табличного стилей, у блока, у типа линии, у стиля мультилинии - но не у полилинии. Кстати, у окружности имени тоже нет.
Получение вершин полилинии в системе координат описания блока (а не во вхождении!):
Код:
[Выделить все]
(defun test (/ ent)

  (defun lwpoly_vert (lwpoly / plinee elev vnv)
    ;; http://www.autocad.ru/cgi-bin/f1/board.cgi?t=26461HC
    (setq plinee (entget lwpoly)
          elev   (cdr (assoc 38 plinee))
          vnv    (cdr (assoc 210 plinee))
          ) ;_ end of setq
    (mapcar
      (function (lambda (x) (trans (list (cadr x) (caddr x) elev) vnv 0)))
      (vl-remove-if-not (function (lambda (x) (= (car x) 10))) plinee)
      ) ;_ end of mapcar
    ) ;_ end of defun


  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (car (nentsel "\nВыберите полилинию <Отмена> : "))
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
           ) ;_ end of and
    (lwpoly_vert ent)
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.03.2012, 00:11
#10
wluk1958


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


Что-то не сходится: результат ТОТ ЖЕ САМЫЙ, как в посте #6 :

(SETQ #NEW(NENTSEL))(SETQ A1(CAR #NEW))(SETQ VLA1(VLAX-ENAME->VLA-OBJECT A1))
(SETQ START10(VLAX-CURVE-GETSTARTPOINT VLA1))(SETQ END10(VLAX-CURVE-GETENDPOINT VLA1))

Т.е. такое впечатление, что там, где исползуется "nentsel" - не для родного вопроса... Блоки с атрибутами не играют. Или я не не так понял ? Спасибо.
wluk1958 вне форума  
 
Непрочитано 10.03.2012, 01:02
#11
Кулик Алексей aka kpblc
Moderator

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


Какая разница - блок с атрибутами или без, если обрабатывается примитив, не имеющий никакого отношения к атрибутам?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.03.2012, 02:15
#12
wluk1958


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


Результирующий список полностью повторяет контур (узлы) полилинии в составе блока, но смещен ахово влево-вниз. Почему - не пойму. Поясните, пожалуйста. Спасибо заранее.
wluk1958 вне форума  
 
Непрочитано 10.03.2012, 03:07
#13
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от wluk1958 Посмотреть сообщение
Почему - не пойму
Потому, что ты не послушал Диму (#2) и не разобрался с разницей между определением блока (BLOCK) и вставкой блока (INSERT).
И поэтому ты не понял, что получаешь вершины полилинии относительно точки вставки блока (и то если масштабные коэффициенты = 1), а не относительно начала координат.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 10.03.2012, 03:15
#14
wluk1958


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


(DEFUN POL(POLYLINENAME / POLYLINEINFO VERTEXNAME LISTOFPOINTS)
(VL-LOAD-COM)
(COND
((= (CDR (ASSOC '0 (ENTGET POLYLINENAME))) "LWPOLYLINE")
(SETQ POLYLINEINFO (ENTGET POLYLINENAME))
(WHILE (VL-POSITION (ASSOC '10 POLYLINEINFO) POLYLINEINFO)
(SETQ LISTOFPOINTS
(CONS
(CDR
(NTH
(VL-POSITION
(ASSOC '10 POLYLINEINFO)
POLYLINEINFO
)
POLYLINEINFO
))
LISTOFPOINTS
))
(SETQ POLYLINEINFO
(VL-REMOVE (ASSOC '10 POLYLINEINFO) POLYLINEINFO)
)))
((= (CDR (ASSOC '0 (ENTGET POLYLINENAME))) "POLYLINE")
(SETQ VERTEXNAME (ENTNEXT POLYLINENAME))
(WHILE VERTEXNAME
(IF (= (CDR (ASSOC '0 (ENTGET VERTEXNAME))) "VERTEX")
(SETQ LISTOFPOINTS
(CONS
(CDR
(ASSOC '10 (ENTGET VERTEXNAME))
)
LISTOFPOINTS
)))
(SETQ VERTEXNAME (ENTNEXT VERTEXNAME))
))
(T
(SETQ LISTOFPOINTS NIL)
))
(REVERSE LISTOFPOINTS)
) ;END

Последний раз редактировалось wluk1958, 10.03.2012 в 22:29.
wluk1958 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как вытащить имя полилинии из блока с атрибутами

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перенести в чертеж блок из файла библиотеки блоков Main Urod Программирование 8 03.02.2010 14:15
Перевод имени блока в имя переменной и обратно Supermax Программирование 11 14.12.2009 23:26
Двойной щелчок по графическому элементу блока с атрибутами kp+ AutoCAD 10 03.12.2009 12:21
Подсчет кабеля при помощи дин. блока с атрибутами serg01 AutoCAD 41 07.05.2009 09:34
Вариация моделей в SCAD - проблемы с РСУ UIII SCAD 2 04.10.2007 13:35