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

Вернуться   Форум 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 - это свойство доступно для изменения.
Просмотров: 1772
 
Непрочитано 08.04.2016, 10:15
1 | #2
kp+

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


попробуйте с помощью 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,091


Цитата:
Сообщение от 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,787


Делаешь 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,091


Здесь хороший пример 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