ADSK2007 发表于 2022-7-6 00:39:45

李:谢谢你的建议,这很有帮助
 
顺致敬意,
 
Adsk公司

ADSK2007 发表于 2022-7-6 00:44:04

李,你的日常工作是在现有的区块。如何更改例程以创建块,请求块的名称,然后向其添加属性?
 
此外,是否可以将字段信息从“图形特性”链接到lisp?假设我已经在“图形属性”窗口中创建了5个具有值的名称,现在我想使用lisp将它们与新创建的块相关联。

Bhull1985 发表于 2022-7-6 00:46:34

你好。
为了澄清起见,请查看以下内容:
首先,您的屏幕上是否已经有了块对象,就像您希望在“wblock”命令中所做的那样?其中块已经构建并放置到图形中,并且您正在赋予它自己的。从dwg的其余部分删除dwg扩展。。。。这几乎就像“块提取”
或者,在lisp例程的上下文中使用的create可能意味着“放置到图形中”,即插入现有块,并将该块重命名为包含新属性的新名称,使其与原始块不同,因此需要一个新名称?
你专门问李,但请记住,这是一个公共论坛,许多大师来回答问题。我不是他们中的一员,但我仍然愿意提供帮助,当我只想提一下,李无疑将能够帮助解决Lisp程序的问题,但有时这可能类似于问中央情报局的时间是什么。如果这个类比有意义的话。。。。我希望是这样,呵呵。并不是说有人责怪你请求李的帮助,但他很忙,你限制了自己从其他大师那里得到答案。可能不是故意的,也可能是故意的——这就更有理由去问和看。

ADSK2007 发表于 2022-7-6 00:52:04

bhull1985年
 
你好bhull,我猜你误解了我,或者可能是我写最后一篇帖子的方式(两种方式,我很抱歉不清楚)-就像这篇帖子一样,我把你的名字放在开头,这意味着回复你的评论。我以为我也在为李先生做同样的事。然而我不是说我只要求他回答我的问题。我尊重你们所有人,理解大家都很忙。如果我写的东西看起来不对,请原谅我。你们都很棒,在你们有时间的时候帮了我很多,我真的很感激。如果你们在我的镇上,我肯定会以某种方式回报你们,或对你们每一个人表现出更多的尊重。我们都有不同的经历,我希望有一天我能成为一个不同的东西,帮助你的手。如果我的lisp知识不如你们先进,我很抱歉,这就是为什么我需要你们的帮助。我希望你和其他人接受我的道歉。
 
现在,请允许我解释一下我们正在做什么以及我们希望实现什么。我们制造复杂的电子设备。我们使用AutoCAD和SolidWorks来设计和建模每个零件。熟悉SolidWorks的人知道软件是如何工作的,以及产品是如何在应用程序中开发的。不幸的是,并不是这里的所有设计师都对该软件足够了解,因此我们正在推进AutoCAD功能,以便在Solidworks中产生相同的结果。
 
让我举一个简单的例子。我们画了一张有一个顶部和四条腿的桌子,首先是3D,然后生成2D图纸-(我知道这不是最佳做法,但这是我无法控制的)。无论如何,一旦绘制了所有零件,我们需要从绘制的对象(桌面、桌腿等)创建块。我们最初要问的是,我们确实知道每个块应该包含哪些属性。这就是为什么属性信息已经在lisp中。然而,lisp只在已经有块的情况下才起作用。我们想要实现的是一个lisp例程,该例程首先激活block命令并请求块的名称,然后在该块内应用这些属性(我们已经在lisp中拥有的属性)。这就是绘制一个对象的过程,使其成为具有属性的块,然后继续绘制下一个图形(例如,有4条腿的椅子、扶手、靠背等)。
 
李提出的问题是在lisp例程中使用字段作为属性,这意味着我们在“图形属性”窗口中创建相同的属性信息。此窗口链接到excel工作表,所有组件、子组件和零件都已在excel工作表中命名,并包含更多信息(例如零件描述、尺寸、光洁度等)。
 
无论如何,上面的lisp在已经创建的块上运行良好。我们希望例程的第一部分从“要更新的块的名称”更改为“输入新块的名称”,这意味着我们正在创建一个块并为其命名,如果完美,则例程的其余部分。
 
我希望我能清楚地解释我们在寻找什么。再次请接受我的道歉
 
顺致敬意,
 
Adsk公司

Bhull1985 发表于 2022-7-6 00:55:18

感谢您花时间非常清楚、简洁地解释您的想法和手头的问题。
具有讽刺意味的是,这是我应该回答的时间,然后等待李先生或其他autolisp大师给你一个比我能够提供给你的更正确的回答。
不过我有一个问题。。。我认为这对你的最终计划非常重要。在为对象指定名称之前,是否要选择所有对象?如果有多个小实体形状组成表格的较大部分,并且这些部分组合在一起以完整地完成表格,并且您希望该程序通过以下方式运行:
1要求提供属于桌子或“较大物体”的物体
2询问块的名称
3使所有选定的对象都具有您告诉它的名称
4为新块提供多个属性并保存定义
...
5 (?) 关闭当前dwg并打开下一个?这是可能的,但取决于您需要什么(可能与dwg相关的数量),可能更容易为所有必要的项目运行程序,然后手动保存dwg并关闭和打开下一个。。。
 
我认为这个过程确实可以用autolisp轻松实现,但正如前面提到的,我们应该等待一个更好的lisp编码器

ADSK2007 发表于 2022-7-6 00:56:35

嗨,bhull
 
桌子和椅子只是一个简单易懂的例子,我们这里不做家具——无论如何,要回答你的问题,请看下面
Q: 在为对象指定名称之前,是否要选择所有对象?
A: 是的,如果我们可以同时按窗口或多个实体进行选择,那就太好了——我们只需要零件的俯视图就可以将其作为一个块并向其添加属性。该块将用于表格中,以识别组件的组件。
 
Q: 如果有多个小实体形状组成了桌子的较大部分,并且这些部分组合在一起以完整地完成桌子
A: 每个零件都是一个块,多个对象是子组件,它们被识别为一个组,因此它们不会一起位于一个块内
 
Q: 你想让这个程序运行
1-询问属于桌子或“较大对象”的对象
A: 要求选择实体很好,不需要复杂的例程
 
2询问块的名称
A: 是的
 
3使所有选定的对象都具有您告诉它的名称
A: 是的
 
4为新块提供多个属性并保存定义
A: 是的
 
5 (?) 关闭当前dwg并打开下一个?
A: 没有多个图形,我们在一个图形中绘制所有对象。块保存在

ADSK2007 发表于 2022-7-6 00:59:16

I was wondering if anyone of you had a chance to take a look at this. Really appreciate your reply.
 
Thanks
 
Adsk

Bhull1985 发表于 2022-7-6 01:03:07

http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/Block-Automated-attribute-values-add-subtract/m-p/4590267/highlight/false#M316592
 
or
 

(defun c:adsk (/ ss pt i ent elist) ; Get Entities   (while (not ss)   (princ "\nSelect Objects to Convert to Blocks:")   (setq ss (ssget '((-4 . ""))))   ) ;_end while ; Get Block Name and Base Point   (while (or (not bn)          (not (snvalid bn))      ) ;_end or   (setq bn (getstring "Specify Block Name: "))   ) ;_end while   (initget 1)   (setq pt (getpoint "Specify Base Point for Block: "));;; Create BLOCK Header   (entmake (list (cons 0 "BLOCK") (cons 10 pt) (cons 2 bn) (cons 70 0)));;;STEP THRU THE SET   (setq i (sslength ss))   (while (>= i (setq i (1- i)) 0)   (setq ent   (ssname ss i)         elist (entget ent)   ) ;_end setq   (entmake elist)   ) ;_end while;;;FINISH THE BLOCK DEFINITION   (entmake (list (cons 0 "ENDBLK") (cons 8 "0")));;;Insert the Block & Delete Originals   (entmake (list (cons 0 "INSERT") (cons 2 bn) (cons 8 "0") (cons 10 pt)))   (command "_.ERASE" ss "")   (redraw)   (AddAttribs)       (prin1)) ;_end defun(defun addattribs ( / blk def)   (while       (not         (or (= "" (setq blk bn))               (tblsearch "BLOCK" blk)         )       )       (princ (strcat "\nBlock \"" blk "\" not found."))   )   (if (/= "" blk)       (progn         (setq def (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) blk))         (vla-addattribute def               (getvar 'textsize)               acattributemodelockposition               "New Attribute 1"               (vlax-3D-point 0 0)               "NEW_TAG1"               "New Value 1"         )         (vla-addattribute def               (getvar 'textsize)               acattributemodelockposition               "New Attribute 2"               (vlax-3D-point 0 (- (* 1.5 (getvar 'textsize))))               "NEW_TAG2"               "New Value 2"         )         (command "_.attsync" "_N" blk)       )   )   (princ))(vl-load-com) (princ)
 
HTH ADSK, sorry for the delay. You're not the only one who's busy

Bhull1985 发表于 2022-7-6 01:07:47

If you would need to include POLYLINES as objects to convert to your blocks I believe the word POLYLINE should be removed from the 5th line. Someone might come and inform why they're not included in the first place but afaik it should be quite easy to allow them in selection again.....simply removing the entity type name from the selection filter should do it.
页: 1 [2]
查看完整版本: 将属性添加到现有d中