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

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

ADT. Программно получить значение храктеристики.

Ответ
Поиск в этой теме
Непрочитано 20.08.2008, 14:03 #1
ADT. Программно получить значение храктеристики.
игорёк
 
проектирование
 
москва
Регистрация: 30.10.2005
Сообщений: 216

Ситуация собственно такая, есть объект к которому "прикреплен" набор характеристик "Площади". Набор состоит из характеристик "площадь-1","площадь-2" ...
Подскажите, кто знает как программно добраться до значений характеристик "площадь-1", "площадь-2".
Или хотябы в каком направлении двигаться....
Просмотров: 7833
 
Непрочитано 20.08.2008, 14:09
#2
Кулик Алексей aka kpblc
Moderator

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


C объекта забиваешь vla-GetExtensionDictionary и дальше по дампу ориентируйся.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.08.2008, 22:31
#3
игорёк

проектирование
 
Регистрация: 30.10.2005
москва
Сообщений: 216


Что-то я совсем запутался...
Код:
[Выделить все]
(defun c:get_data ()
  (VL-LOAD-COM)
  (setq obj (vlax-ename->vla-object (car(entsel))))
  (setq ed (vla-get-HasExtensionDictionary obj))
  (setq ed1 (vla-getExtensionDictionary obj))
  (setq ed1 (vlax-vla-object->ename ed1))
  (setq ed1_dxf (entget ed1))
  (setq a1 (entget (cdr (assoc 330 ed1_dxf))))
  (vlax-dump-object a1 T)
(princ)
 )
И снова получаю огромный список, а что дальше? до бесконечности?
У меня наверно руки кривые....


Вот что в сом. строке
((-1 . <Имя объекта: 7ec4ae08>) (0 .
"AEC_SPACE") (5 . "39889") (102 . "{ACAD_XDICTIONARY") (360 . <Имя объекта:
7ec4b088>) (102 . "}") (330 . <Имя объекта: 7ec2ecf8>) (100 . "AcDbEntity") (67
. 0) (410 . "Model") (8 . "помещения_штрих") (100 . "AecDbEntity") (102 .
"{AEC_SUBOBJECT") (300 . "AecImpSpace") (100 . "AecImpObj") (3 . "") (100 .
"AecImpEnt") (171 . 0) (100 . "AecImpGeo") (10 101782.0 75996.1 0.0) (15 1.0
0.0 0.0) (16 0.0 1.0 0.0) (210 0.0 0.0 1.0) (360 . <Имя объекта: 0>) (100 .
"AecImpLayoutTool") (100 . "AecImpCellLayoutTool") (100 . "AecImpSpace") (102 .
"{AEC_SUBOBJECT") (300 . "AecGeProfile") (100 . "AecImpObj") (3 . "") (100 .
"AecGeProfile") (102 . "{AECGERINGS") (100 . "AecImpObj") (3 . "") (100 .
"AecImpArray") (90 . 1) (102 . "{AEC_SUBOBJECT") (300 . "AecGeRing") (100 .
"AecImpObj") (3 . "") (100 . "AecGeCompCurve2d") (102 . "{AECGESEGMENTS") (100
. "AecImpObj") (3 . "") (100 . "AecImpArray") (90 . 4) (102 . "{AEC_SUBOBJECT")
(300 . "AecSpaceSurface") (100 . "AecImpObj") (3 . "") (100 . "AecGeSegment2d")
(102 . "{ACGECURVE2D") (280 . 0) (10 -120.0 0.0 0.0) (10 -4400.0 0.0 0.0) (102
. "ACGECURVE2D}") (70 . 8) (280 . 0) (100 . "AecSpaceSurface") (102 .
"AEC_SUBOBJECT}") (102 . "{AEC_SUBOBJECT") (300 . "AecSpaceSurface") (100 .
"AecImpObj") (3 . "") (100 . "AecGeSegment2d") (102 . "{ACGECURVE2D") (280 . 0)
(10 -4520.0 0.0 0.0) (10 0.0 -3630.44 0.0) (102 . "ACGECURVE2D}") (70 . 8) (280
. 0) (100 . "AecSpaceSurface") (102 . "AEC_SUBOBJECT}") (102 .
"{AEC_SUBOBJECT") (300 . "AecSpaceSurface") (100 . "AecImpObj") (3 . "") (100 .
"AecGeSegment2d") (102 . "{ACGECURVE2D") (280 . 0) (10 -4520.0 -3630.44 0.0)
(10 4400.0 -1.14733e-009 0.0) (102 . "ACGECURVE2D}") (70 . 8) (280 . 0) (100 .
"AecSpaceSurface") (102 . "AEC_SUBOBJECT}") (102 . "{AEC_SUBOBJECT") (300 .
"AecSpaceSurface") (100 . "AecImpObj") (3 . "") (100 . "AecGeSegment2d") (102 .
"{ACGECURVE2D") (280 . 0) (10 -120.0 -3630.44 0.0) (10 5.39876e-009 3630.44
0.0) (102 . "ACGECURVE2D}") (70 . 8) (280 . 0) (100 . "AecSpaceSurface") (102 .
"AEC_SUBOBJECT}") (102 . "AECGESEGMENTS}") (70 . 1) (100 . "AecGeRing") (102 .
"AEC_SUBOBJECT}") (102 . "AECGERINGS}") (70 . 0) (102 . "AEC_SUBOBJECT}") (102
. "{AEC_SPACE_INTERFERENCES") (100 . "AecImpObj") (3 . "") (100 .
"AecImpArray") (90 . 0) (102 . "AEC_SPACE_INTERFERENCES}") (40 . 2750.0) (41 .
200.0) (42 . 150.0) (43 . 0.0) (342 . <Имя объекта: 7ec30f08>) (102 .
"AEC_SUBOBJECT}") (102 . "{AEC_NULLOBJECT}") (100 . "AecDbGeo") (100 .
"AecDbLayoutTool") (100 . "AecDbCellLayoutTool") (100 . "AecDbSpace"))
игорёк вне форума  
 
Непрочитано 20.08.2008, 22:58
#4
Кулик Алексей aka kpblc
Moderator

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


Не-а, не так
Вот вариант:
Код:
[Выделить все]
(defun _kpblc-aec-get-propertysetdefinition-by-object (obj propertyset-name)
                                                      ;|
*    Получение указателей на PropertySetDefinition (для объекта).
*    Параметры вызова:
	obj			указатель на обрабатываемый объект
	propertyset-name	маска имени PropertySetDefinition. nil -> "*"
*    Примеры вызова:
(_kpblc-aec-get-propertysetdefinition-by-object (car (entsel)) "*")
; '(#<VLA-OBJECT IAecSchedulePropertySet 1a301990> #<VLA-OBJECT IAecSchedulePropertySet 1a302760>)
*    Возвращает либо список из PropertySetDefinition, либо nil.
|;
  (setq propertyset-name
         (cond
           ((/= (type propertyset-name) 'str) "*")
           (propertyset-name (strcase propertyset-name))
           (t "*")
           ) ;_ end of cond
        ) ;_ end of setq
  (vl-remove-if-not
    '(lambda (x) (wcmatch (strcase (vla-get-name x)) propertyset-name))
    (apply 'append
           (mapcar '_kpblc-conv-vla-to-list
                   (_kpblc-conv-vla-to-list
                     (vla-getextensiondictionary (_kpblc-conv-ent-to-vla obj))
                     ) ;_ end of _kpblc-conv-vla-to-list
                   ) ;_ end of mapcar
           ) ;_ end of apply
    ) ;_ end of vl-remove-if-not
  ) ;_ end of defun
_kpblc-conv-vla-to-list абсолютно аналогичен _dwgru-conv-vla-to-list (см. в DwgRuLispLib). Потом:
Код:
[Выделить все]
(defun _kpblc-aec-get-propertysetdefinition-field-by-object (obj
                                                             propertyset-name
                                                             field
                                                             /
                                                             prop
                                                             )
                                                            ;|
*    Получение указателей на поля (по маске) PropertySetDefinition для объекта
*    Параметры вызова:
	obj			указатель на обрабатываемый объект
	propertyset-name	маска имени PropertySetDefinition. nil -> "*"
	field			маска имени поля
*    Примеры вызова:
(_kpblc-aec-get-propertysetdefinition-by-object (car (entsel)) "*")
; '(#<VLA-OBJECT IAecSchedulePropertySet 1a301990> #<VLA-OBJECT IAecSchedulePropertySet 1a302760>)
*    Возвращает либо список из PropertySetDefinition, либо nil.
|;
  (setq field (cond
                ((/= (type field) 'str) "*")
                (field (strcase field))
                (t "*")
                ) ;_ end of cond
        ) ;_ end of setq
  (vl-remove-if-not
    (function
      (lambda (x)
        (wcmatch (strcase (vla-get-name x)) field)
        ) ;_ end of lambda
      ) ;_ end of function
    (apply
      'append
      (mapcar
        (function
          (lambda (x)
            (_kpblc-conv-vla-to-list (_kpblc-property-get x 'properties))
            ) ;_ end of lambda
          ) ;_ end of function
        (_kpblc-aec-get-propertysetdefinition-by-object obj propertyset-name)
        ) ;_ end of mapcar
      ) ;_ end of apply
    ) ;_ end of vl-remove-if-not
  ) ;_ end of defun
_kpblc-property-get - "обертка" для vlax-get-property. Вроде ничего не забыл критичного...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.08.2008, 11:00
#5
игорёк

проектирование
 
Регистрация: 30.10.2005
москва
Сообщений: 216


Чтото не получется спотыкается на участке
Код:
[Выделить все]
 (mapcar '_kpblc-conv-vla-to-list
                   (_kpblc-conv-vla-to-list
                    (vla-getextensiondictionary (_kpblc-conv-ent-to-vla obj)) 
                     ) ;_ end of _kpblc-conv-vla-to-list
                   ) ;_ end of mapcar
Выдает:

; error: bad argument type: listp #<VLA-OBJECT IAcadDictionary
090fba74>
игорёк вне форума  
 
Непрочитано 21.08.2008, 23:42
#6
Кулик Алексей aka kpblc
Moderator

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


Образец файла давай. Потому как у меня работает как часы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.08.2008, 10:34
#7
игорёк

проектирование
 
Регистрация: 30.10.2005
москва
Сообщений: 216


PropertySetDefinition-"111"
field-"222"
Вложения
Тип файла: dwg
DWG 2004
test.dwg (187.4 Кб, 1252 просмотров)
игорёк вне форума  
 
Непрочитано 25.08.2008, 09:16
#8
Кулик Алексей aka kpblc
Moderator

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


У тебя ж там пустое значение...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.08.2008, 10:11
#9
игорёк

проектирование
 
Регистрация: 30.10.2005
москва
Сообщений: 216


Я тут на выходных поковырялся, почитал книгу Н.Полещука и все вроде стало на свои места только возник другой вопрос.
В книге "AutoLisp и VisualLisp в среде AutoCAD" 2006г. на странице 345 подробно разбирается работа с "Extension Dictionary".
Там разбирается пример с фильтрами слоев.
Вопрос собственно какой, почему в dxf прописано имя группового фильтра как есть (его просто найти ) а фильтры имеют "условные имена *A1, *А2"
А где настоящее имя?
В моем случае я вижу содеожимое прикрепленных свойств, а имена *A1, *A2.

А как понять какое свойство A1 какое А2?
Ведь мне нужно их различать по имени.
игорёк вне форума  
 
Непрочитано 25.08.2008, 10:27
#10
Кулик Алексей aka kpblc
Moderator

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


На твоем файле:
Код:
[Выделить все]
_$ (_kpblc-aec-get-propertysetdefinition-by-object (car (entsel)) nil)
(#<VLA-OBJECT IAecSchedulePropertySet 1f0f4e40>)
_$ (_kpblc-aec-get-propertysetdefinition-field-by-object (car (entsel)) nil nil)
(#<VLA-OBJECT IAecScheduleProperty 1f24dd70>)
_$ (vlax-dump-Object (car (_kpblc-aec-get-propertysetdefinition-field-by-object (car (entsel)) nil nil)))
; IAecScheduleProperty: An individual Property object with a fixed name and variable value
; Property values:
;   Automatic (RO) = 0
;   Index = 0
;   Name (RO) = "222"
;   Owner = #<VLA-OBJECT IAecScheduleProperties 1f24ddf0>
;   Value = ""
T
_$
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.08.2008, 10:39
#11
игорёк

проектирование
 
Регистрация: 30.10.2005
москва
Сообщений: 216


Разобрался!!!
Спасибо!!!
Принцип понятен теперь надо все оформить.
Еще раз огромное спасибо таким людям как Н. Полищук, kpblc и всем посетителям форума за безкорыстную помощь!
игорёк вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > ADT. Программно получить значение храктеристики.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема экспорта файлов по IFC из ADT в лиру и ревит thygank Revit 1 03.08.2008 18:08
как программно ввести значение по умолчанию Victorovich Программирование 3 02.07.2008 13:15
Как получить значение системной переменной (аналог getvar)? mmmx Программирование 2 06.08.2007 15:02
Как получить значение атрибута используя Diesel-выражение? mental Программирование 1 12.04.2007 10:16