乐筑天下

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

[编程交流] Lisp插入动态块

[复制链接]

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-6 09:12:59 | 显示全部楼层 |阅读模式
我想用lisp插入一个动态块,并在插入时利用块的对齐功能。这是我通常用来插入块的:
 
  1.                  (if (setq pt (setq INPT (getpoint "\nPick Insertion Point: ")))
  2.                 (command "_.-insert" block INPT "1" "1" "0"))))

 
我想插入块,但不是在运行命令之前选择输入,我希望能够选择屏幕上的点,并使块旋转以匹配基于对齐特征的线。
 
我该怎么做?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 09:22:53 | 显示全部楼层
你可以这样做。。。。
 
  1. (defun c:test (/ name o e p1 p2 ins)
  2. ;; Tharwat 01. 07. 2011
  3. (if (and (setq name (getstring T "\n Name of Block to insert :"))
  4.           (tblsearch "BLOCK" name)
  5.           (setq o (entsel "\n Select Line :"))
  6.           (eq (cdr (assoc 0 (setq e (entget (car o))))) "LINE")
  7.      )
  8.    (progn
  9.      (setq p1 (cdr (assoc 10 e))
  10.            p2 (cdr (assoc 11 e))
  11.      )
  12.      (command "_.-insert" name p1 1. 1. 0.)
  13.      (command "_.align"
  14.               (entlast)
  15.               ""
  16.               (setq ins (cdr (assoc 10 (entget (entlast)))))
  17.               p1
  18.               (list (car ins) (+ (cadr ins) 0.5) 0.)
  19.               p2
  20.               ""
  21.               ""
  22.      )
  23.      (redraw)
  24.    )
  25.    (princ "\n Block not found or Selection is not a line !! ")
  26. )
  27. (princ)
  28. )

 
塔瓦特
回复

使用道具 举报

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-6 09:29:49 | 显示全部楼层
谢谢Tharwat,
 
我试着画一条线,然后插入块。我修改了你的代码给我这个,但它找不到块。有什么想法吗?
 
  1. (defun c:Guy_Rope (/ name o e p1 p2 ins)
  2. ;; Tharwat 01. 07. 2011
  3. (command "_.-layer" "_N" "CCC_SURVEY_Existing Stay or Guy Rope" "_M" "CCC_SURVEY_Existing Stay or Guy Rope" "_C" "1" "CCC_SURVEY_Existing Stay or Guy Rope" "" )
  4. (command "._pline")
  5. (if (and (setq name "Guy_Rope_Survey")
  6.           (tblsearch "BLOCK" name)
  7.           (setq o (entsel "\n Select Line :"))
  8.           (eq (cdr (assoc 0 (setq e (entget (car o))))) "LINE")
  9.      )
  10.    (progn
  11.      (setq p1 (cdr (assoc 10 e))
  12.            p2 (cdr (assoc 11 e))
  13.      )
  14.      (command "_.-insert" name p1 "1" "1" "0")
  15.      (command "_.align"
  16.               (entlast)
  17.               ""
  18.               (setq ins (cdr (assoc 10 (entget (entlast)))))
  19.               p1
  20.               (list (car ins) (+ (cadr ins) 0.5) 0.)
  21.               p2
  22.               ""
  23.               ""
  24.      )
  25.      (redraw)
  26.    )
  27.    (princ "\n Block not found or Selection is not a line !! ")
  28. )
  29. (princ)
  30. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 09:35:07 | 显示全部楼层
这行不通,因为折线和直线不同,为什么要改变第一条线的想法?
 
实体线只有起点和终点,但多段线与此完全不同
回复

使用道具 举报

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-6 09:45:37 | 显示全部楼层
嗯,我不知道有这么大的区别。不管怎样,我运行了你的例行程序,它确实与普林的工作。但它没有做我想要的,所以我回去重新写了一遍。这就是我现在拥有的:
  1. (defun c:guy_rope1 (/ pline SUCE SUSM SUCL SUCR rope_block)
  2. (setq SUCE (getvar "cmdecho"))  
  3. (setq SUSM (getvar "osmode"))
  4. (setq SUCL (getvar "clayer"))
  5. (setq SUCR (getvar "cecolor"))
  6. (setq vl1 (list
  7.        (cons 0 "LAYER")        ;Name of entity
  8.        (cons 100 "AcDbSymbolTableRecord")                    ;Open Records
  9.        (cons 100 "AcDbLayerTableRecord")                    ;Locate Layer Table
  10.        (cons 2 "CCC_SURVEY_Existing Stay or Guy Rope")        ;Name of Layer
  11.        (cons 62 1)                            ;colour = light grey
  12.        (cons 70 0)                            ;state
  13.        (cons 290 1)                            ;1=plot, 0=Don't plot
  14.            )                            ;End of entity list
  15.        )
  16.        (entmake vl1)
  17. (setvar "clayer" "CCC_SURVEY_Existing Stay or Guy Rope")  
  18. (setvar "cecolor" "Bylayer")  
  19. (princ "\nDraw an stay or guy rope line: ")
  20. (setvar "plinegen" 1)
  21. (command "._pline")
  22. (while (= 1 (logand 1 (getvar "cmdactive")))
  23. (command pause))
  24. (setq pline (entlast)
  25. elist (entget pline)
  26. )
  27. (setq name "guy_rope_survey")
  28. (command ".-Insert" name pause pause "" )
  29. (setq rope_block (entlast)
  30. elist (entget rope_block)
  31. )
  32. (command "explode" rope_block)
  33. (setvar "cmdecho"   SUCE)
  34. (setvar "osmode" SUSM)
  35. (setvar "clayer" SUCL)
  36. (setvar "cecolor" SUCR)
  37. (princ)
  38. )

 
我有一些问题,也许有人可以帮我解决。这是例程的第一个aprt的命令转储:
命令:guy\u rope1
 
画一条拉线或拉线_普林线
指定起点:
当前线宽为0.0000
指定下一点或[弧/半宽/长度/撤消/宽度]:
指定下一点或[弧/闭合/半宽/长度/撤消/宽度]:
 
为什么会这样_普林出现了?
我的图层变量没有重置。我的图层没有恢复到原始值。
还有谁有更好的方法来运行insert,这样用户就可以使用动态块的对齐功能,而不必右键单击来完成命令?
 
谢谢
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:50:24 | 显示全部楼层
可能是因为您没有将cmdecho设置为0?
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:57:59 | 显示全部楼层
您是否考虑过改用vla insertBlock方法,然后简单地遍历动态块对象的属性(即可见性状态、属性等)?这真的很简单,而且更少(如果有的话?)系统变量需要存储/恢复。
 
(^^这是我为动态标题栏所做的^^)
回复

使用道具 举报

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-6 10:04:17 | 显示全部楼层
不,我没有见过RenderMan。不过听起来很有趣。我该怎么做?
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 10:12:01 | 显示全部楼层
看看我的附加代码。特别是块:GetParameters、块:GetParam、块:GetParamValue和块:PutParamValue函数。
 
除此之外,您需要掌握vla模型/图纸空间对象才能使用其vla InsertBlock方法。查看ActiveX/COM下的开发人员帮助。
区块数据。LSP
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 10:19:26 | 显示全部楼层
 
Irneb花时间为您提供了一些帮助您的功能。
 
如果您无法理解这些函数和开发人员帮助之间需要什么,请发回您的问题,也许还有一份动态块的副本。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 06:02 , Processed in 0.535613 second(s), 72 queries .

© 2020-2025 乐筑天下

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