乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 19|回复: 19

[编程交流] Entmake 0。插入属性

[复制链接]

37

主题

125

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
190
发表于 2022-7-6 10:32:52 | 显示全部楼层 |阅读模式
大家好
 
我正在尝试用autolisp编写一个块替换工具。(我用vba编写了这个工具,它很简单)遗憾的是,lisp没有vba那么简单。
 
到目前为止,脚本遵循以下过程
 
-选择所有特定类型的块“SSGET”
-为每个块创建一个列表
((输入)(属性详细信息)(附件…)
-创建新块
-添加额外属性
 
 
问题是我找不到一种插入新锁的实用方法。如果一个块有四个属性,那么(命令“insert”)需要9个参数(5个默认值),这不是很实用,因为需要为每个属性块重写重新插入函数。
 
有没有关于使用entmake插入块>
 
如果您对此有任何想法,我们将不胜感激
 
编辑:
 
即使有一种在不知道属性数量的情况下使用默认值的方法,问题也可以解决
 
编辑:
 
多亏了Buzzard
 
http://www.cadtutor.net/forum/showthread.php?t=36793
 
谢谢
奥利
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:37:06 | 显示全部楼层
是的,我认为有三种(可能更多的方法)可以做到这一点:
 
1) (setvar“ATTREQ”0);;不提示输入属性,然后(命令“-insert”。。。
 
2) Entmake the INSERT definition(假设表中存在块定义):
 
类似于:
 
  1. (entmake (list (cons 0 "INSERT") (cons 2 bn) (cons 8 "0") (cons 10 pt)))

 
这是一个很好的例子:
 
  1. (defun c:obj2blk1 (/ ss bn pt i ent elist)
  2. ; Get Entities
  3.    (while (not ss)
  4.    (princ "\nSelect Objects to Convert to Blocks:")
  5.    (setq ss (ssget '((-4 . "<NOT") (0 . "INSERT,POLYLINE,VIEWPORT") (-4 . "NOT>"))))
  6.    ) ;_  end while
  7. ; Get Block Name and Base Point
  8.    (while (or (not bn)
  9.           (not (snvalid bn))
  10.       ) ;_  end or
  11.    (setq bn (getstring "Specify Block Name: "))
  12.    ) ;_  end while
  13.    (initget 1)
  14.    (setq pt (getpoint "Specify Base Point for Block: "))
  15. ;;; Create BLOCK Header
  16.    (entmake (list (cons 0 "BLOCK") (cons 10 pt) (cons 2 bn) (cons 70 0)))
  17. ;;;STEP THRU THE SET
  18.    (setq i (sslength ss))
  19.    (while (>= i (setq i (1- i)) 0)
  20.    (setq ent   (ssname ss i)
  21.          elist (entget ent)
  22.    ) ;_  end setq
  23.    (entmake elist)
  24.    ) ;_  end while
  25. ;;;FINISH THE BLOCK DEFINITION
  26.    (entmake (list (cons 0 "ENDBLK") (cons 8 "0")))
  27. ;;;Insert the Block & Delete Originals
  28.    (entmake (list (cons 0 "INSERT") (cons 2 bn) (cons 8 "0") (cons 10 pt)))
  29.    (command "_.ERASE" ss "")
  30.    (redraw)
  31.    (prin1)
  32. ) ;_  end defun

 
以上是我与David Bethel合作的代码,它将自动从对象的选择集生成一个块。
 
3) 使用VL方法:
 
  1. (vla-insertblock <space> <pt>... etc)

 
希望这有帮助
 
回复

使用道具 举报

37

主题

125

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
190
发表于 2022-7-6 10:41:23 | 显示全部楼层
谢谢李
 
不幸的是,我仍然有问题,这是我到目前为止的功能
 
现在返回
命令:;错误:ActiveX服务器返回错误:未知名称:HasAttributes
 
有一次返回:对于hasattribtues,vla false
奥利
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:44:49 | 显示全部楼层
奥利,“attlist”参数的格式是什么?
回复

使用道具 举报

37

主题

125

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
190
发表于 2022-7-6 10:47:02 | 显示全部楼层
 
这是列表格式
 
  1. (
  2. (63562.0 82951.4 0.0)
  3. (Tag Textvalue height visible  LAYERNAME "prompt")
  4. (Tag Textvalue  300.0 :vlax-false LAYERNAME "prompt")
  5. (Tag Textvalue  300.0 :vlax-false LAYERNAME "prompt")
  6. (Tag Textvalue  300.0 :vlax-true LAYERNAME "prompt")
  7. (Tag Textvalue  300.0 :vlax-true LAYERNAME "prompt")
  8. (Tag Textvalue  300.0 :vlax-true LAYERNAME "prompt")
  9. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:48:48 | 显示全部楼层
可以尝试以下方法:
 
  1. (defun InsertBlock  (attlist bname / c ent tag)
  2. (if (and (setq blk
  3.                  (entmake[color=Red][b]x[/b][/color]
  4.                    (list
  5.                      (cons 0 "INSERT")
  6.                      (cons 2 bname)
  7.                      (cons 66 1)
  8.                      (cons 10 (car attlist)))))
  9.           (setq blk (vlax-ename->vla-object blk)))
  10.    (if (eq (vla-get-hasattributes blk) :vlax-true)
  11.      (progn
  12.        (foreach att  (vlax-safearray->list
  13.                        (vlax-variant-value
  14.                          (vla-getattributes blk)))
  15.          (setq tag (vla-get-tagstring att))
  16.          (princ (strcat "\n" tag))
  17.          (foreach n  attlist
  18.            (if (= (car n) tag)
  19.              (vla-put-textstring att (cadr n)))))))))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:52:33 | 显示全部楼层
另一个,使用VL:
 
  1. [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] InsertBlock  [b][color=RED]([/color][/b]attlst bname [b][color=BLUE]/[/color][/b] c ent tag[b][color=RED])[/color][/b]
  2. [b][color=RED]([/color][/b][b][color=BLUE]vl-load-com[/color][/b][b][color=RED])[/color][/b]
  3. [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-catch-all-error-p[/color][/b]
  4.        [b][color=RED]([/color][/b][b][color=BLUE]vl-catch-all-apply[/color][/b]
  5.          [b][color=RED]([/color][/b][b][color=BLUE]function[/color][/b]
  6.            [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b] [b][color=RED])[/color][/b]
  7.              [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] blk
  8.                [b][color=RED]([/color][/b][b][color=BLUE]vla-insertblock[/color][/b]
  9.                  [b][color=RED]([/color][/b][b][color=BLUE]vla-get-ModelSpace[/color][/b]
  10.                    [b][color=RED]([/color][/b][b][color=BLUE]vla-get-ActiveDocument[/color][/b]
  11.                      [b][color=RED]([/color][/b][b][color=BLUE]vlax-get-acad-object[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  12.                  [b][color=RED]([/color][/b][b][color=BLUE]vlax-3D-point[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] attlst[b][color=RED])[/color][/b][b][color=RED])[/color][/b] bName [b][color=#009999]1.[/color][/b] [b][color=#009999]1.[/color][/b] [b][color=#009999]1.[/color][/b] [b][color=#009999]0.[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=BLUE]nil[/color][/b]
  13.    [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [color=Blue][b]:vlax-true[/b][/color] [b][color=RED]([/color][/b][b][color=BLUE]vla-get-HasAttributes[/color][/b] blk[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  14.      [b][color=RED]([/color][/b][b][color=BLUE]foreach[/color][/b] att [b][color=RED]([/color][/b][b][color=BLUE]vlax-safearray->list[/color][/b]
  15.                     [b][color=RED]([/color][/b][b][color=BLUE]vlax-variant-value[/color][/b]
  16.                       [b][color=RED]([/color][/b][b][color=BLUE]vla-getAttributes[/color][/b] blk[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  17.        [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcat[/color][/b] [b][color=#ff00ff]"\n"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] tag [b][color=RED]([/color][/b][b][color=BLUE]vla-get-tagString[/color][/b] att[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  18.        [b][color=RED]([/color][/b][b][color=BLUE]foreach[/color][/b] x [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] attlst[b][color=RED])[/color][/b]
  19.          [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] tag [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] x[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  20.            [b][color=RED]([/color][/b][b][color=BLUE]vla-put-TextString[/color][/b] att [b][color=RED]([/color][/b][b][color=BLUE]cadr[/color][/b] x[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
回复

使用道具 举报

32

主题

1166

帖子

1146

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-7-6 10:57:51 | 显示全部楼层
 
 
奥利,
 
我在entmake上为块提供的线程我发现不是一个非常实用的方法。你将做两倍的工作,做一个漫长的过程只是为了使一个块。不是很理想。虽然这样创建一个积木很有意思,也有很好的学习体验,但我不赞成这种方法。我现在尝试学习一些VL方法作为替代方法。VL虽然看起来很复杂,但从长远来看,你很可能会避免头痛。
 
以下方法使用insert命令。这些不是VL程序。他们会告诉你我经历了什么。看看他们。在看过这些套路之后,你可能想学习VL。
 
祝你好运
秃鹰
SL.zip
IDS_V1.03。拉链
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:58:36 | 显示全部楼层
我认为奥利只想做插入定义,而不是块定义,所以我认为这对他来说不会太糟糕。
 
回复

使用道具 举报

32

主题

1166

帖子

1146

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-7-6 11:02:08 | 显示全部楼层
 
我不确定,没问题。他得到了很好的照顾。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 17:55 , Processed in 0.461765 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表