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

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

Как средствами LISP сделать обычный атрибут постоянным?

Ответ
Поиск в этой теме
Непрочитано 08.04.2016, 07:04 #1
Как средствами LISP сделать обычный атрибут постоянным?
mkung
 
RUSSIA
Регистрация: 05.09.2007
Сообщений: 165

Можно ли обычный атрибут блока средствами LISP сделать постоянным? Если да, то как?
Через GetAttributes получаю IAcadAttributeReference, а к нему не применяется vla-put-Constant...
Если смотрю через vlax-dump-object, то constant (RO).
Если делаю то же с постоянным атрибутом, полученным GetConctantAttributes - это свойство доступно для изменения.
Просмотров: 1783
 
Непрочитано 08.04.2016, 10:15
1 | #2
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


попробуйте с помощью dxf-кода 70. к текущему значению прибавить 2 и атрибут станет постоянным
небольшой код для иллюстрации
Код:
[Выделить все]
 (setq f (entget (car (nentsel))))
(setq f (subst (cons 70 (+ 2 (cdr (assoc 70 f)))) (assoc 70 f) f))
(entmod f)
По первому запросу выбрать атрибут, по второму - блок, в который он входит.

Последний раз редактировалось kp+, 08.04.2016 в 10:43.
kp+ вне форума  
 
Автор темы   Непрочитано 08.04.2016, 13:01
#3
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 165


Цитата:
Сообщение от kp+ Посмотреть сообщение
попробуйте с помощью dxf-кода 70. к текущему значению прибавить 2 и атрибут станет постоянным
небольшой код для иллюстрации
Спасибо. Этот вариант работает.
Но немного не так, как хотелось бы.
Смысл сделать постоянным - чтобы при новой вставке значение атрибута сохранялось.
Если я делаю постоянным в "редакторе блока", то так и работает.
Если сделать по предлагаемому коду, то применяется это только к конкретному вхождению блока.
А при новой вставке этот атрибут по-прежнему "непостоянный"
mkung вне форума  
 
Непрочитано 08.04.2016, 15:46
#4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


Цитата:
Сообщение от mkung Посмотреть сообщение
Если сделать по предлагаемому коду, то применяется это только к конкретному вхождению блока.
Ну так код сугубо для иллюстрации. Если Вы желаете программно править определение атрибута (attdef) в определении блока - то самое трудное, это до него добраться. Судя по #1, это Вы сделали и получили vla-объект определения атрибута. А далее vlax-vla-object->ename в помощь и вторая строчка из приведенного в #2 кода.
kp+ вне форума  
 
Автор темы   Непрочитано 13.04.2016, 13:34
#5
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 165


Цитата:
Сообщение от kp+ Посмотреть сообщение
Судя по #1, это Вы сделали и получили vla-объект определения атрибута
Похоже - нет. Я шел через выбор блока, а в этом случае, видимо, работаешь с вхождением...
Получается тоже только для этого вхождения...
Пошел другим путем через vla-get-blocks. Получил определения блоков.
Из них выбрал нужный. Вроде это ОПРЕДЕЛЕНИЕ БЛОКА.
Не пойму - как добраться до атрибутов.
(vlax-dump-object block 1)
; IAcadBlock: Определение блока, включающее в себя имя блока и набор объектов.
; Значения свойств:
; Application (RO) = #<VLA-OBJECT IAcadApplication 00007ff7399ed910>
; BlockScaling = 0
; Comments = ""
; Count (RO) = 57
; Document (RO) = #<VLA-OBJECT IAcadDocument 000000002b367ef8>
; Explodable = -1
; Handle (RO) = "65B6"
; HasExtensionDictionary (RO) = -1
; IsDynamicBlock (RO) = 0
; IsLayout (RO) = 0
; IsXRef (RO) = 0
; Layout (RO) = AutoCAD.Application: Свойство недоступно в текущем состоянии
; Name = "Основной_штамп_v4"
; ObjectID (RO) = 52
; ObjectID32 (RO) = 52
; ObjectName (RO) = "AcDbBlockTableRecord"
; Origin = (0.0 0.0 0.0)
; OwnerID (RO) = 44
; OwnerID32 (RO) = 44
; Path = AutoCAD.Application: Неприменимо
; Units = 0
; XRefDatabase (RO) = AutoCAD.Application: Нет базы данных
; Поддерживаемые методы:
; Add3DFace (4)
; Add3DMesh (3)
; Add3DPoly (1)
; AddArc (4)
; AddAttribute (6)
; AddBox (4)
; AddCircle (2)
; AddCone (3)
; AddCustomObject (1)
; AddCylinder (3)
; AddDim3PointAngular (4)
; AddDimAligned (3)
; AddDimAngular (4)
; AddDimArc (4)
; AddDimDiametric (3)
; AddDimOrdinate (3)
; AddDimRadial (3)
; AddDimRadialLarge (5)
; AddDimRotated (4)
; AddEllipse (3)
; AddEllipticalCone (4)
; AddEllipticalCylinder (4)
; AddExtrudedSolid (3)
; AddExtrudedSolidAlongPath (2)
; AddHatch (4)
; AddLeader (3)
; AddLightWeightPolyline (1)
; AddLine (2)
; AddMInsertBlock (11)
; AddMLeader (2)
; AddMLine (1)
; AddMText (3)
; AddPoint (1)
; AddPolyfaceMesh (2)
; AddPolyline (1)
; AddRaster (4)
; AddRay (2)
; AddRegion (1)
; AddRevolvedSolid (4)
; AddSection (3)
; AddShape (4)
; AddSolid (4)
; AddSphere (2)
; AddSpline (3)
; AddTable (5)
; AddText (3)
; AddTolerance (3)
; AddTorus (3)
; AddTrace (1)
; AddWedge (4)
; AddXline (2)
; AttachExternalReference (9)
; Bind (1)
; Delete ()
; Detach ()
; GetExtensionDictionary ()
; GetXData (3)
; InsertBlock (7)
; Item (1)
; Reload ()
; SetXData (2)
; Unload ()

Последний раз редактировалось mkung, 13.04.2016 в 15:09.
mkung вне форума  
 
Непрочитано 13.04.2016, 13:44
1 | #6
Кулик Алексей aka kpblc
Moderator

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


Делаешь vlax-for и проверяешь имя объекта. Если AcDbAtributeDefinition (кажется, так) - то это атрибут. Ну и снимай для него дамп...
Код:
[Выделить все]
 (defun test (/ blk_def res)
  (setq blk_def (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                          (vla-get-effectivename (vlax-ename->vla-object (car (entsel))))
                          ) ;_ end of vla-item
        ) ;_ end of setq
  (vlax-for ent blk_def
    (if (wcmatch (strcase (vla-get-objectname ent)) "*ATT*")
      (setq res (cons ent res))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (reverse res)
  ) ;_ end of defun
Код:
[Выделить все]
 _$ (setq lst (test))
(#<VLA-OBJECT IAcadAttribute 16c8b5dc> #<VLA-OBJECT IAcadAttribute 16c8b564>)
_$ (vlax-dump-Object (car lst) t)
; IAcadAttribute: AutoCAD Attribute Interface
; Property values:
;   Alignment = 13
;   Application (RO) = #<VLA-OBJECT IAcadApplication 006f7814>
;   Backward = 0
;   Constant = 0
;   Document (RO) = #<VLA-OBJECT IAcadDocument 0d14e76c>
;   EntityTransparency = "ByLayer"
;   FieldLength = 0
;   Handle (RO) = "241"
;   HasExtensionDictionary (RO) = -1
;   Height = 0.09375
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 16d6a94c>
;   InsertionPoint = (-0.0351956 0.0266328 0.0)
;   Invisible = 0
;   Layer = "0"
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   LockPosition = -1
;   Material = "ByLayer"
;   Mode = 24
;   MTextAttribute = 0
;   MTextAttributeContent = ""
;   MTextBoundaryWidth = 0.0
;   MTextDrawingDirection = 5
;   Normal = (0.0 0.0 1.0)
;   ObjectID (RO) = 2129671752
;   ObjectName (RO) = "AcDbAttributeDefinition"
;   ObliqueAngle = 0.0
;   OwnerID (RO) = 2129671592
;   PlotStyleName = "ByLayer"
;   Preset = -1
;   PromptString = "Enter view number"
;   Rotation = 0.0
;   ScaleFactor = 1.0
;   StyleName = "Tahoma"
;   TagString = "VIEWNUMBER"
;   TextAlignmentPoint = (-5.55112e-017 -2.22045e-016 0.0)
;   TextGenerationFlag = 0
;   TextString = "1"
;   Thickness = 0.0
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 16adce08>
;   UpsideDown = 0
;   Verify = 0
;   Visible = -1
; Methods supported:
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   Copy ()
;   Delete ()
;   GetBoundingBox (2)
;   GetExtensionDictionary ()
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetXData (2)
;   TransformBy (1)
;   Update ()
;   UpdateMTextAttribute ()
T
_$ 


----- добавлено через 59 сек. -----
P.S. Возможно, вместо vla-get-effectivename понадобится vla-get-name
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.04.2016, 13:58
#7
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


Здесь хороший пример http://forums.autodesk.com/t5/visual...s/td-p/2114394
kp+ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как средствами LISP сделать обычный атрибут постоянным?

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как быстро средствами autocad сделать 3d модель из 2d чертежей. gesper AutoCAD 19 02.12.2010 09:07
Как сделать диалоговое окно, описанное в DCL файле и вызванное Lisp программой, немодальным? E-degtyarev LISP 9 28.05.2010 09:10
Как средствами VBA сделать "AI_DESELECT " Miniril Программирование 1 23.03.2010 11:07
Возможно ли сделать атрибут невидимым на чертеже при изменении ручки состояния видимости? JokerrSergh AutoCAD 15 15.01.2009 12:26
Как сделать "прозрачный" lisp? ASLYS LISP 21 01.06.2007 15:43