乐筑天下

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

[编程交流] 创建预设

[复制链接]

21

主题

89

帖子

68

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 13:35:03 | 显示全部楼层 |阅读模式
首先感谢dlanorh提供了以下非常有效的例程。现在,我有了不同距离的不同块,我想的是,如果可以创建预设,而不必重复复制整个路由,并更改块名称和距离?
可能有点像Emmanuel在这里做的(预设)
非常感谢
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 13:39:10 | 显示全部楼层
嗨,疯子。这似乎是assoc功能的完美候选者。只需构建一个由块名/dist关联列表组成的列表。这样,您可以使用块名作为键从assoc动态检索距离。如果需要修改,不要重复例程是避免差异的最佳方式。。。
干杯
回复

使用道具 举报

21

主题

89

帖子

68

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 13:43:55 | 显示全部楼层
嗨,杰夫,再次感谢你的帮助,对不起,我应该把它放在上面的代码里的什么地方?我要补充一下吗? 
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 13:45:53 | 显示全部楼层
不完全是,这是该概念的“独立”演示。我不太清楚你到底想做什么。。。您想替换while中8的增量加法,并选择开头的块,对吗?
您需要在第一次setq调用时添加paramlst(使用cdoc、ms…)以及用户的选择。不要忘记,setq可以同时设置任意数量的变量
基本上在开始时,变量是在单个setq调用上设置的,这意味着如果要在内部添加paramlst变量,必须排除setq,如下所示:
  1. (setq c_doc (vla-get-activedocument (vlax-get-acad-object))
  2.         ms (vla-get-modelspace c_doc)
  3.         obj (vlax-ename->vla-object (car (entsel "\nSelect arc, line, spline or polyline : ")))
  4.         e_pt (vlax-curve-getendpoint obj)
  5.         p_len (vlax-curve-getdistatpoint obj e_pt)
  6.         dist 0
  7.         paramlst '(("block1" . 3)("block2" . 5)("block3" . 8))
  8.   );end_setq
现在,对于用户的选择,我们需要把它放在一个变量中,但是因为我们需要先使用initget,所以我们将在原始setq之后执行。对于initget,我们将使用1作为第一个参数,以防止用户在点击enter时返回“”。对于第二个参数,我们需要给它一个由空格分隔的所有选项组成的字符串(如“block1 block2 block3”)。然后我们将使用getkword,它需要一个字符串作为参数,该字符串包含由/分隔的所有选项,所有选项都用方括号括起来(如“[block1/block2/block3]”)。由于这是由paramlst变量中的选项列表驱动的,并且我们不希望每次在paramlst中添加选项时都需要更新initget和getkword字符串,因此我们将使initget和keywork都是动态和自动的。试着一步一步地遵循我从paramlst得到2个所需字符串的逻辑。
(我不会使用代码标签来加粗部分和添加颜色来逐步评估if。不要咬我绿巨人!) 143510dpmppre2repkqpmp.png
(initget 1(vl string right trim“”(应用“strcat(mapcar)”(lambda(x)(strcat x“”))(mapcar“car paramlstаа])))
Paramlst包含((“block1.3)(“block2.5”(“block3.8))
(mapcar的car paramlst)将返回(“block1”“block2”“block3”),一个由每个列表元素的car组成的列表。
(initget 1(vl string right trim“”(应用“strcat(mapcar)”(lambda(x)(strcat x“”)'(“block1”“block2”“block3”))))
(mapcar'(lambda(x)(strcat x”“)'(“block1”“block2”“block3”)将返回(“block1”“block2”“block3”),一个由每个字符串和空格串联而成的列表
(initget 1(vl string right trim”“(应用“strcat”(“block1”“block2”“block3”)))
(应用“strcat”(“block1”“block2”“block3”)将返回“block1 block2 block3”,它相当于(strcat“block1”“block2”“block3”)
(initget 1(vl string right trim”““block1 block2 block3”))
(vl string right trim”““block1 block2 block3”)将删除字符串右侧的任何空格,并返回“block1 block2 block3”。
现在我们只剩下(initget 1“block1 block2 block3”)
对于getkword,我采用了相同的方法,但在strcat和vl string right trim中使用“/”而不是空格“”,但必须添加方括号,因此增加了strcat“[“string”]”。由于我们稍后将使用该值,因此getkword的返回值可以存储在变量中。 
(setq bname(getkword(strcat“[”(vl string right trim”/“(应用‘strcat(mapcar’(λ(x)(strcat x”/”))(mapcar‘car paramlst)))”]))
现在唯一要做的是使用存储在bname变量中的getkword中的块名,而不是当前在vla insert块中使用的名称“block1”,并本地化新变量paramlst和bname。试着先做,而不是与此比较。。。
 
  1. ; original code by Dlanorh  July 2018
  2. ;with some modifs by Jef! made on the following thread
  3. ;https://www.cadtutor.net/forum/topic/65895-creating-presets/
  4. (defun c:mes (/ c_doc ms obj e_pt p_len dist i_pt i_param b_ang n_obj o_lst paramlst bname)
  5.   (vl-load-com)
  6.   (setq c_doc (vla-get-activedocument (vlax-get-acad-object))
  7.         ms (vla-get-modelspace c_doc)
  8.         obj (vlax-ename->vla-object (car (entsel "\nSelect arc, line, spline or polyline : ")))
  9.         e_pt (vlax-curve-getendpoint obj)
  10.         p_len (vlax-curve-getdistatpoint obj e_pt)
  11.         paramlst '(("block1" . 3) ("block2" . 5) ("block3" . 8));Jef!
  12.         dist 0
  13.   );end_setq
  14.   (initget 1 (vl-string-right-trim " "(apply 'strcat (mapcar '(lambda (x) (strcat x " ")) (mapcar 'car paramlst)))));Jef!
  15.   (setq bname (getkword (strcat "["(vl-string-right-trim "/"(apply 'strcat (mapcar '(lambda (x) (strcat x "/")) (mapcar 'car paramlst))))"]")));Jef!
  16.   (while (< dist p_len)
  17.     (setq i_pt (vlax-curve-getpointatdist obj dist)
  18.           i_param (vlax-curve-getparamatpoint obj i_pt)  
  19.           b_ang (angle '(0 0 0) (vlax-curve-getfirstderiv obj i_param))
  20.           n_obj (vla-insertblock ms (vlax-3d-point i_pt) bname 1.0 1.0 1.0 b_ang); Jef! - we insert bname instead of "block1"
  21.           o_lst (cons n_obj o_lst)
  22.           dist (+ dist (cdr (assoc bname paramlst)));;;now we get dist increment from paramlst using bname
  23.     );end_setq
  24.   );end_while
  25.   (initget "Yes No")
  26.   (if (= (getkword "Flip Block? [Yes / No] : ") "Yes")
  27.     (foreach n_obj o_lst
  28.       (vlax-put-property n_obj 'rotation (+ (vlax-get-property n_obj 'rotation) pi))
  29.     );end_foreach
  30.   );end_if  
  31. );end_defun
回复

使用道具 举报

21

主题

89

帖子

68

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 13:48:16 | 显示全部楼层
哇!我还没有试过,但我还需要在不同的距离设置“dist 0”,所以说它看起来像
不确定这是否只是一个想法
你太棒了!
143511jbmedpnuyyu0ebgp.png
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 13:52:54 | 显示全部楼层
谢谢
关联列表只能包含键和值(key.value)。该值可以是列表tho。您可以使用另一个列表assoc list对该值应用相同的概念。
现在,如果用户选择“block1”,(assoc“block1”paramlst)将返回((“start.3)(“dist.4)),而不是具有数字值。
在该列表中,我们可以同时获得assoc“start”或“dist”。很好嗯 143512t0p0xxj4uaaucjax.png
回复

使用道具 举报

21

主题

89

帖子

68

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 13:56:19 | 显示全部楼层
好吧,我完全迷路了,无法跟随,那么需要先执行独立命令吗?对不起,我真的很困惑,我唯一能做的lisp是这样的(Defun c:mn()(命令“matchprop”))哈哈,我甚至不确定这是不是lisp lol,不管怎样,我试过了,我说错误的参数时出错了。
再次感谢您的帮助,非常感谢
p、 s((“开始.3)(“dist”4)(块1层))?
如果可能的话,非常感谢
143513wyq4pop2zixolwza.png
143514z333m7xcde3e3e0h.png
143516amjm4prjjm99pdbq.png
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 13:58:14 | 显示全部楼层
这是一个“独立”的演示,演示了作为值存储在另一个关联列表中的关联列表(start dist)的概念。你了解关联列表的概念吗?它是一个由如下(键.值)组成的列表:((键1.VALUE)(键1.VALUE))
如果您有这样的lst定义:
(setq LST’((“a.1”(“b.2)))
(assoc“a”LST)将返回(KEY.VALUE)assoc,该assoc的键为“a”,因此在本例中(“a.1”)。
(assoc“b”LST)将返回键为“b”的(KEY.VALUE)assoc,因此在本例中为(“b”。2)。
在列表中,car函数返回1rst元素。cdr函数将返回一个不包含1rst元素的列表(因此所有内容都在车后)。在点对(也称为assoc)上,它返回第二个元素,即值
要仅检索存储在列表LST的“a”assoc中的值,可以使用(cdr(assoc“a”LST))。
... 如果到目前为止您一直在跟踪,您知道(assoc“a”LST)将返回(“a”。1)。
经过评估,(cdr(assoc“a”LST))变为(cdr(“a”.1)),它将返回与LST列表的“a”键相关的值。
回到我的(第一个)独立演示,我有这个
(setq PARAMLST’((“块1.3)(“块2.5)))
在我的上一个演示中,我存储了一个列表((“start.3)(“dist.4”),而不是将“simple”3作为“block1”的存储值
在我的上一个演示中,我存储了一个列表((“start.5)(“dist.6”),而不是将“simple”5作为“block2”的存储值
(setq PARAMLST’((“block1”。(“start.3”(“dist.4”)(“block2”。(“start.5”(“dist.6)))(到目前为止还好吗?)
现在,如果用户选择“block1”,我们必须搜索相应的assoc
(assoc“block1”PARAMLST)将返回:(“block1”。((“start.3)(“dist.4”)。。。但我们只需要价值
(cdr(assoc“block1”PARAMLST))将仅返回值:((“start”.3)(“dist”.4))
现在,让我们仔细看看这个值
((“start.3”(“dist.4))现在,为了好玩,让我们更改它的颜色,看看您是否识别相同的图案
((“start.3”(“dist.4))。。。它的格式与我在本回复开头的LST示例相同。
不要害怕用谷歌搜索出来。我可能不是第一个解释car、cdr和assoc的人,这些知识很容易找到。只需关注示例和家庭作业:花在“自己”理解和找出提供的示例上的时间,至少与你认为我需要花在回复上的时间相同。(即:在我写了一个小时的东西后8分钟,不要发表“我不懂”。集中精力,真正尝试一下,我保证你会对你能理解和演绎的东西感到惊讶。小心点,Lisp程序很容易上瘾 143517nkdp7ngnf9k5zg99.png
回复

使用道具 举报

21

主题

89

帖子

68

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 14:01:38 | 显示全部楼层
谢谢,我会这样做,然后再次回来,谢谢你的详细解释:)
是的,我知道这很让人上瘾:D我明天再试一次非常感谢
143518fst3w2ruzu698th6.png
143519rp4p66n5gg4ng7gy.png
回复

使用道具 举报

21

主题

89

帖子

68

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 14:03:49 | 显示全部楼层
这就是我到目前为止所得到的,我试着在vlide上打开它,而这个中断与
当我运行它到cad时,我得到了
将重试
143521oh75w8g00g53awpw.png
143520fi3zx3lu3j7g322c.png
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-15 00:52 , Processed in 2.182165 second(s), 74 queries .

© 2020-2025 乐筑天下

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