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

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

ПОле, вставленное в атрибут блока

Ответ
Поиск в этой теме
Непрочитано 21.04.2006, 17:42 #1
ПОле, вставленное в атрибут блока
maestro
 
проектировщик
 
Украина
Регистрация: 08.05.2004
Сообщений: 1,123

Поля в атрибутах.

В теме
http://dwg.ru/forum/viewtopic.php?t=3488
говорилось о тонкостях программирование блока с атрибутами, в которые вставлено поле.

У меня другая проблема, но видимо, оно как-то перекликается.

Имеется блок. Динамический. Унутри- примитив. Меряем его длину и полем вставляем в атрибут. Суть проблемы- как только такой блок копируешь в карман и вставляешь заново, то вместо значений в полях там тольок кучи "плю-минусов", т.е. не считает. При попытке долезть до поля через атрибут ругается

The object referenced by the field is not a valid object.

В аттаче прилагаю ентот файл.

Господа- кто сталкивался и что делать?
[ATTACH]1145626930.rar[/ATTACH]
Просмотров: 13174
 
Непрочитано 21.04.2006, 17:45
#2
Кулик Алексей aka kpblc
Moderator

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


ИМХО: неизлечимо. Поле привязывается к ID объекта, которое меняется при вставке из буфера. Поле надо переделывать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.04.2006, 18:02
#3
asys

архитектор
 
Регистрация: 10.08.2005
Ростов-на-Дону
Сообщений: 5,295


у меня такая фигня творится с отметками что я делал. Иногда, случается при вставке из буфера обмена блока-отметки в файл где уже есть такой же блок. Лечу или удалением предыдущей версии блока или работаю в новом чистом файле. По другому ничего не придумал Притом что это не везде, а в некоторый файлах, что наталкивает на мысль, что что-то за это отвечает, но не в блоке проблема
asys вне форума  
 
Непрочитано 21.04.2006, 18:09
#4
Startrek

AutoCAD/AutoLISP
 
Регистрация: 27.08.2003
Seattle/USA
Сообщений: 1,133


в 2007-М можно привесить в атрибуту переменную лиспа ( вмест объекта) - может сработать если лиспом ее менять, но с динамическим блоком , черт его знает?
__________________
Сквозь тернии к звездам.... и обратно :yes:
Startrek вне форума  
 
Непрочитано 10.02.2007, 13:19
#5
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Поднимем из глубин тему.
Вопрос, собственно, по программированию, но не начинать же новую.

Кто знает, как из атрибута программно вытащить формулу поля (на VBA)?
Помогите, очень пожалуйста
den001 вне форума  
 
Непрочитано 11.02.2007, 23:01
#6
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Нда... Все сходится к тому, что на VBA эту задачу не решить. Может, на Lisp'e есть решение? Господа программеры! Не дайте сойти с ума!
den001 вне форума  
 
Непрочитано 12.02.2007, 03:31
#7
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


возможно я не так понял..
но вот это - %<\AcVar CustomDP.Масштаб>%
или вот это - %<\AcVar ctab>%
случайно не есть та самая "формула поля"?
Димас вне форума  
 
Непрочитано 12.02.2007, 11:50
#8
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
возможно я не так понял..
но вот это - %<\AcVar CustomDP.Масштаб>%
или вот это - %<\AcVar ctab>%
случайно не есть та самая "формула поля"?
Да да она самая, тока теперь нужно достать ее програмно из атрибута вхождения блока, на лиспе или VBA.
Sleekka вне форума  
 
Непрочитано 12.02.2007, 11:57
#9
Кулик Алексей aka kpblc
Moderator

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


"Формулу" поля можно попробовать получить через .FieldCode. А значение - через .TextString (ЯТД).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.02.2007, 12:04
#10
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Крыс
Так в том то и дело, что у атрибута почему-то НЕТ свойства .FieldCode!

Собственно, если это невозможно на VBA, то остается один путь: каким-то манером передать из VBA в Lisp атрибут, как объект, или передать ID объекта, а обратно получить формулу поля (назовем это так). Возможно ли такое решение? C Lisp'ом я, мягко говоря, не знаком.
den001 вне форума  
 
Непрочитано 12.02.2007, 12:43
#11
Кулик Алексей aka kpblc
Moderator

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


Хм... Действительно. Есть только FieldLength, которая поможет как мертвому припарки.
Ну не хочет кад по-плохому, по-хорошему будет еще хуже
Без проверок, все на уровне идеи:
Код:
[Выделить все]
(defun _kpblc-block-get-field-codes (/ ent res)
  (if (and (setq ent (car (entsel "\nÓêàæèòå íà áëîê <Îòìåíà> : ")))
           (= (cdr (assoc 0 (entget ent))) "INSERT")
           (= (cdr (assoc 66 (entget ent))) 1)
           ) ;_ end of and
    (progn
      (setq res
             (mapcar
               '(lambda (x)
                  (cdr
                    (assoc
                      2
                      (entget
                        (cdr
                          (assoc
                            360
                            (entget
                              (cdr
                                (assoc
                                  360
                                  (entget
                                    (cdr
                                      (assoc 360 (entget (vlax-vla-object->ename x)))
                                      ) ;_ end of cdr
                                    ) ;_ end of entget
                                  ) ;_ end of assoc
                                ) ;_ end of cdr
                              ) ;_ end of entget
                            ) ;_ end of assoc
                          ) ;_ end of cdr
                        ) ;_ end of entget
                      ) ;_ end of assoc
                    ) ;_ end of cdr
                  ) ;_ end of lambda
               (vlax-safearray->list
                 (vlax-variant-value (vla-getattributes (vlax-ename->vla-object ent)))
                 ) ;_ end of vlax-safearray->list
               ) ;_ end of mapcar
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun
Предупреждаю сразу - не отслеживается наличие "не-полей" в качестве атрибутов. Это надо обрабатывать отдельно, а я сейчас не могу - работы многовато
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.02.2007, 21:29
#12
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Крыс
Спасибо за помощь, однако код что-то не то выдает

На Lisp'e добрые люди задачу решили, теперь бьюсь головой об стену, как это в VBA запихать? Как передать в Lisp, ну допустим ID атрибута, а обратно получить код поля?

Вот код, который получает код поля (в данном случае - ссылку на другой текстовый объект, из-за чего, собственно, и весь сыр-бор), потом запрашивает МТекст, в который это поле вставляет
Код:
[Выделить все]
(defun C:FAV2 (/ att field_code field_list field_mask head objid tail txt)
  (vl-load-com)
  (if
    (setq att (car (nentsel "\nВыбери атрибут >> ")))
     (progn
       (setq field_list
	      (entget
		(cdr
		  (assoc
		    360
		    (entget
		      (cdr (assoc
			     360
			     (entget (cdr (assoc 360 (entget att))))
			   )
		      )
		    )
		  )
		)
	      )
       )
(setq txt (cdr (assoc 331 (entget (cdar	(cddddr	(member	'(100 . "AcDbField")
							field_list
						)
					)
				  )
			  )
	    )))
(setq field_mask (cdr (assoc 2 (entget (cdar	(cddddr	(member	'(100 . "AcDbField")
							field_list
						)
					)
				  )
			  )
	    )))
(setq objId (vla-get-objectid (vlax-ename->vla-object txt)))
(setq head (strcat "%<" (substr field_mask 1
	 (+ (vl-string-search "<" field_mask ) 2)) "_ObjId " (itoa objId)))
(setq tail (strcat (substr field_mask (1+ (vl-string-search ">" field_mask )))
		   " \\f " "\"%bl2\"" ">%"))
(setq field_code (strcat head tail))
(alert field_code)
(vla-put-textstring
  (vlax-ename->vla-object
    (car (entsel "\nВыбери MTEXT >>"))) field_code)
)
    )
)
(prompt "\n\t\t***\t  Type FAV2 to execute\t***")
(princ)
den001 вне форума  
 
Непрочитано 12.02.2007, 22:27
#13
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


2den001
Чы читал сотый элемент словаря AcDbField? на ВБА? в проге сказано что читается этот элемент, только поле там хранится не в нужном нам виде, а вдругом, потом получают ObjektID преобразовав VLA объект, о добавляют нужные скобки, и удаляют ненужные, вобщем скорее всего все ето хозяйство реализуемо на ВБА, КРЫС!!! ну разрули программу пожалуйста - очень надо!!!
Sleekka вне форума  
 
Непрочитано 12.02.2007, 23:01
#14
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Sleekka
Я ж говорил, не получилось у меня вообще словарь прочесть. Я пробовал .GetExtentionDictionary, и ни фига. Точнее, есть там объект "ACAD_FIELD", но попытки что-либо с ним сделать не увенчались успехом.
den001 вне форума  
 
Непрочитано 13.02.2007, 09:33
#15
Кулик Алексей aka kpblc
Moderator

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


Так. Для лиспа у меня вроде как срослось:
Код:
[Выделить все]
(defun get-fld-code (/ blk att res)
  (vl-load-com)
  (if (and (setq blk (car (entsel "\nУказываем блок <Выход> : ")))
           (setq blk (vlax-ename->vla-object blk))
           (= (vla-get-objectname blk) "AcDbBlockReference")
           (< 0
              (vlax-safearray-get-u-bound
                (setq att (vlax-variant-value (vla-getattributes blk)))
                1
                ) ;_ end of vlax-safearray-get-u-bound
              ) ;_ end of >
           ) ;_ end of and
    (progn
      (vlax-for ent (vla-item (vla-get-blocks
                                (vla-get-activedocument (vlax-get-acad-object))
                                ) ;_ end of vla-get-blocks
                              (vla-get-name blk)
                              ) ;_ end of vla-item
        (if (= (vla-get-objectname ent) "AcDbAttributeDefinition")
          (setq att (append att (list ent)))
          ) ;_ end of if
        ) ;_ end of vlax-for
      (setq res
             (mapcar
               '(lambda (x)
                  (cdr
                    (assoc 2
                           (entget (cdr (assoc 360 (entget (cdr (assoc 360 x))))))
                           ) ;_ end of assoc
                    ) ;_ end of cdr
                  ) ;_ end of lambda
               (vl-remove-if-not
                 '(lambda (x) (assoc 3 x))
                 (mapcar
                   '(lambda (x)
                      (entget
                        (cdr (assoc 360 (entget (vlax-vla-object->ename x))))
                        ) ;_ end of entget
                      ) ;_ end of lambda
                   att
                   ) ;_ end of mapcar
                 ) ;_ end of vl-remove-if-not
               ) ;_ end of mapcar
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun
Вот только интересно, что в коде den001 делает 331 группа? По-моему, их там не особо есть, если атрибут - поле. Ну да ладно.
На VBA не получилось - через HasExtensionDictionary выполнить корректную проверку не удалось. Чего-то там совсем я запутался. В качестве начала что-то подобное:
Код:
[Выделить все]
Function GetFldCode()
Dim blk As AcadEntity, EntCounter  As AcadEntity
Dim BasePoint(2) As Double
Dim arAttr() As AcadEntity
On Error Resume Next
  ThisDrawing.Utility.GetEntity blk, BasePoint
  If Err <> 0 Or blk.ObjectName <> "AcDbBlockReference" Then
    MsgBox "Object selection error!", vbOKOnly + vbCritical + vbApplicationModal
    Exit Function
  End If
  For Each EntCounter In ThisDrawing.Blocks.Item(blk.Name)
    If EntCounter.ObjectName = "AcDbAttributeDefinition" And _
        EntCounter.HasExtensionDictionary And _
        EntCounter.GetExtensionDictionary(0).Name = "ACAD_FIELD" Then
      ReDim Preserve arAttr(UBound(arAttr) + 1)
      Set arAttr(UBound(arAttr)) = EntCounter
    End If
  Next EntCounter
End Function
Только почему-то в ADT 2005 корректно не срабатывало - засовывало все полностью. Скорее всего, проблема была именно в строке
Код:
[Выделить все]
EntCounter.GetExtensionDictionary(0).Name = "ACAD_FIELD"
Ведь GetExtrnsionDictionary не только возвращает указатель на словарь, но и создает его В общем, черт-те что...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.02.2007, 12:31
#16
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Крыс
Спасибо.

А с GetExtensionDictionary я тоже долго возился, потом плюнул. Решил сойти с ума как-нибудь в другой раз

Как бы теперь Lisp и VBA увязать, вот вопрос? У меня есть ID атрибута (можно добыть ID блока, если надо), с каким бубном поскакать, чтобы он в код поля превратился? Меня пока не осенило...
den001 вне форума  
 
Непрочитано 13.02.2007, 12:52
#17
Кулик Алексей aka kpblc
Moderator

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


Дык ента...
Если лиспом, то можно использовать нечто наподобие:
Код:
[Выделить все]
(strcat "%<\\|AcObjProp Object(%<\\_ObjID " (vla-get-ObjectID (vlax-ename->vla-object(car (entsel)))) "%>).И_ЗДЕСЬ_СВОЙСТВО")
Свойство - по аналогии с
Код:
[Выделить все]
XScaleFactor \\f \"%.30q0\">%"
Думаю, что на VBA будет нечто типа:
Код:
[Выделить все]
"%<\AcObjProp Object(%<\_ObjId " & _
    obj.ObjectID & ">%).XScaleFactor \f " & Chr(34) & _
    "%.30q0" & Chr(34) & ">%"
Я не проверял ни один вариант, ни другой, все на уровне предположений.
P.S. На форуме как-то вроде были решения по этому вопросу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.02.2007, 13:35
#18
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Крыс
Да я не об этом. Про это я в курсе.

Как из VBA вызвать Lisp-фунцкцию, которая по заданному ID атрибута вернет его значение в виде кода поля, с которым в VBA можно было бы дальше работать. Проще говоря, ищется замена отсутствующему в VBA свойству FieldCode для атрибутов.
Или я уже торможу? По-моему, еще нет...
den001 вне форума  
 
Непрочитано 13.02.2007, 14:40
#19
Кулик Алексей aka kpblc
Moderator

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


Я сейчас торможу по-черному, поэтому не обижайся, ок?
ThsDrawing.SendCommand "(lisp-function parameters)"
ИМХО так вызывать функцию. А какие параметры ей передавать - ну это уж от нее и будет зависеть.
Нечто наподобие такого, наверное?
LISP:
Код:
[Выделить все]
(defun blk-att-field-code (att-id / att_obj res)
  (vl-catch-all-apply
    (function
      (lambda ()
        (setq att_obj (vla-objectidtoobject
                        (vla-get-activedocument (vlax-get-acad-object))
                        att-id
                        ) ;_ end of vla-ObjectIDToObject
              res     (cdr (assoc
                             2
                             (entget
                               (cdr
                                 (assoc
                                   360
                                   (entget
                                     (cdr
                                       (assoc
                                         360
                                         (entget
                                           (cdr
                                             (assoc
                                               360
                                               (entget (vlax-vla-object->ename att_obj))
                                               ) ;_ end of assoc
                                             ) ;_ end of cdr
                                           ) ;_ end of entget
                                         ) ;_ end of assoc
                                       ) ;_ end of cdr
                                     ) ;_ end of entget
                                   ) ;_ end of assoc
                                 ) ;_ end of cdr
                               ) ;_ end of entget
                             ) ;_ end of assoc
                           ) ;_ end of cdr
              ) ;_ end of setq
        ) ;_ end of lambda
      ) ;_ end of function
    ) ;_ end of vl-catch-all-apply
  (if (not res)
    ""
    res
    ) ;_ end of if
  ) ;_ end of defun
VBA:
Код:
[Выделить все]
ThisDrawing.SendCommand "(blk-att-field-code " & CStr(obj.ObjectID) & ")"
Оно?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.02.2007, 15:15
#20
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Крыс
Не-а

Что-то и Lisp не то выдает, и это, SendCommand же ничего не возвращает... [sm1402]
den001 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > ПОле, вставленное в атрибут блока

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