乐筑天下

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

[编程交流] 初学者问题,显示/隐藏

[复制链接]

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:54:35 | 显示全部楼层 |阅读模式
你好论坛
我刚刚开始学习lisp,并在学习过程中创建了一些小程序。我有一些VBA和C++的基本知识,但我注意到lisp是一种完全不同的野兽。
目前,我正试图找出如何为一个布局创建一个脚本,其中包含几个块,这些块将根据设置的日期隐藏或可见。
我知道可以使用层、过滤器和层状态来执行其中的一些操作,但我想尝试一下。
 
我的想法是在每个blocks注释字段中输入一个from/to-date作为标志。
然后,我将让用户提供一个日期,让脚本在块之间循环,并将每个块放在显示/不显示中。
 
这是我到目前为止一直在想的,但我仍然没有找到隐藏/显示块的方法。
代码中也缺少一些布尔运算,但我可以自己输入。
非常感谢您的帮助
 
  1. (defun C:cblk ( / blk check cmnt date_from date_to entity obj objid)
  2. (vl-load-com)
  3. (setq blk (tblnext "BLOCK" T))
  4. ;loop through the blocks
  5. (while blk  
  6. (setq check (assoc 0 blk)
  7. ;read comment in block
  8. cmnt (cdr(assoc 4 blk))
  9. entity(cdr(assoc -2 blk))
  10. ;extract dates from block comment
  11. date_from (substr cmnt 1 10)
  12. date_to (substr cmnt 12 21)
  13. ;put vla-object in obj
  14. obj (vlax-ename->vla-object entity)
  15. ; Line below is intended to hide/show the block but doesn't work
  16. ;(vla-put-Visible obj :vlax-false)
  17.       
  18. blk (tblnext "BLOCK")
  19. ) ;_ end setq
  20. ) ;_ end while
  21. (princ)
  22. );defun
  23. (princ)
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:04:19 | 显示全部楼层
我们看不到您如何使用日期信息作为显示/隐藏操作的标志。。。示例DWG与2个这样的块将是很好的和解释ab使用日期信息。。。
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:11:55 | 显示全部楼层
Oki。
 
日期在描述区域中设置:
185440p5pr41dz5l4lr5rq.png
 
 
运行脚本时,请尝试附加的dwg,并查看date\u from和date\u to变量。
块测试。图纸
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:14:02 | 显示全部楼层
如果date_from在两个街区内相同怎么办。。。第一个显示的是date_到更早的那个?您必须以某种方式对块进行排序。。。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:24:18 | 显示全部楼层
如果我在最后一句话中是正确的,并且你们有支持ISOLATEOBJECTS命令的ACAD,也许像这样的东西可能就是答案。。。
 
  1. (defun c:showblkbydate ( / remchar bl ss i )
  2. (vl-load-com)
  3. (defun remchar ( char str / strn ch )
  4.    (setq strn "")
  5.    (while (/= str "")
  6.      (setq ch (substr str 1 1))
  7.      (if (= ch char)
  8.        (setq ch "")
  9.      )
  10.      (setq str (substr str 2))
  11.      (setq strn (strcat strn ch))
  12.    )
  13.    strn
  14. )
  15. (vlax-for b (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  16.    (if
  17.      (and
  18.        (not (wcmatch (strcase (vla-get-name b)) "*MODEL*,*PAPER*"))
  19.        (= (vla-get-isxref b) :vlax-false)
  20.        (/= (vla-get-comments b) "")
  21.      )
  22.      (setq bl (cons (cons (vla-get-comments b) b) bl))
  23.    )
  24. )
  25. (setq bl
  26.    (vl-sort bl '(lambda ( a b )
  27.      (if (= (atoi (remchar "-" (substr (car a) 1 10))) (atoi (remchar "-" (substr (car b) 1 10))))
  28.        (< (atoi (remchar "-" (substr (car a) 12))) (atoi (remchar "-" (substr (car b) 12))))
  29.        (< (atoi (remchar "-" (substr (car a) 1 10))) (atoi (remchar "-" (substr (car b) 1 10))))
  30.      ))
  31.    )
  32. )
  33. (if bl
  34.    (foreach b bl
  35.      (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 (vla-get-name (cdr b))))))
  36.      (if ss
  37.        (repeat (setq i (sslength ss))
  38.          (prompt "\nENTER TO CONTINUE...")
  39.          (command "_.ISOLATEOBJECTS" (ssname ss (setq i (1- i))) "")
  40.          (while (progn (setq gr (grread nil)) (if (or (equal gr '(2 13)) (equal gr '(2 32))) (setq gr nil) t)))
  41.          (command "_.UNISOLATEOBJECTS")
  42.        )
  43.      )
  44.    )
  45. )
  46. (princ)
  47. )
HTH,M.R。
回复

使用道具 举报

10

主题

8258

帖子

8335

银币

初来乍到

Rank: 1

铜币
31
发表于 2022-7-5 18:26:00 | 显示全部楼层
修改块和更改文件日期时会发生什么情况?
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:31:19 | 显示全部楼层
马尔科·里巴:好的。非常感谢。
看来我还有很多东西要学。
明天我回来工作的时候,我会看看你的剧本。
 
备注:没关系。我的目的是跟踪描述字段中的日期,因此如果您更新块并且不触摸描述,应该可以吗?
 
顺便问一下,你们能推荐一本好的LISP书吗?
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:38:15 | 显示全部楼层
在我看来,最好将块层更改为关闭/打开,就像备注一样,你仍然有一个主控件,隐藏块意味着你看不到它,我可以看到复制块的一些问题,因为无法看到它已经存在。
 
如果你有kindle,我为VLisp买了4本书,每本大约8美元。Google lisp+David Stein。
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:43:20 | 显示全部楼层
我一直在逐步阅读脚本,并试图理解它的内部工作原理(仍在早期)。
 
假设我们正在使用我先前附加的dwg。
我希望用户在脚本中输入日期,在本例中为2016-08-01。
这意味着“区块1”的日期范围设置为2016-01-01;2016年12月31日应可见。
“区块2”,其日期范围设置为2016-01-01;2016-06-31不应可见,因为2016-08-01不在其日期范围内。
希望这能更好地解释情况
 
我还想指出,这个脚本将在工厂布局中使用,在工厂布局中,我们只使用唯一的块,因此,如果重复出现问题,这不会是一个问题。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:54:10 | 显示全部楼层
试试这个,也更新了我以前的代码。。。
 
  1. (defun c:showblkbydate ( / remchar date bl ss i )
  2. (vl-load-com)
  3. (defun remchar ( char str / strn ch )
  4.    (setq strn "")
  5.    (while (/= str "")
  6.      (setq ch (substr str 1 1))
  7.      (if (= ch char)
  8.        (setq ch "")
  9.      )
  10.      (setq str (substr str 2))
  11.      (setq strn (strcat strn ch))
  12.    )
  13.    strn
  14. )
  15. (initget 1)
  16. (setq date (getstring "\nSpecify range check date ex. "2016-08-01" : "))
  17. (vlax-for b (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  18.    (if
  19.      (and
  20.        (not (wcmatch (strcase (vla-get-name b)) "*MODEL*,*PAPER*"))
  21.        (= (vla-get-isxref b) :vlax-false)
  22.        (/= (vla-get-comments b) "")
  23.      )
  24.      (setq bl (cons (cons (vla-get-comments b) b) bl))
  25.    )
  26. )
  27. (setq bl
  28.    (vl-sort bl '(lambda ( a b )
  29.      (if (= (atoi (remchar "-" (substr (car a) 1 10))) (atoi (remchar "-" (substr (car b) 1 10))))
  30.        (< (atoi (remchar "-" (substr (car a) 12))) (atoi (remchar "-" (substr (car b) 12))))
  31.        (< (atoi (remchar "-" (substr (car a) 1 10))) (atoi (remchar "-" (substr (car b) 1 10))))
  32.      ))
  33.    )
  34. )
  35. (setq bl
  36.    (vl-remove-if-not '(lambda ( x )
  37.      (< (atoi (remchar "-" (substr (car x) 1 10))) (atoi (remchar "-" date)) (atoi (remchar "-" (substr (car x) 12))))
  38.      )
  39.      bl
  40.    )
  41. )
  42. (if bl
  43.    (foreach b bl
  44.      (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 (vla-get-name (cdr b))))))
  45.      (if ss
  46.        (repeat (setq i (sslength ss))
  47.          (prompt "\nENTER TO CONTINUE...")
  48.          (command "_.ISOLATEOBJECTS" (ssname ss (setq i (1- i))) "")
  49.          (while (progn (setq gr (grread nil)) (if (or (equal gr '(2 13)) (equal gr '(2 32))) (setq gr nil) t)))
  50.          (command "_.UNISOLATEOBJECTS")
  51.        )
  52.      )
  53.    )
  54. )
  55. (princ)
  56. )

 
M、 R。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 00:36 , Processed in 0.553321 second(s), 74 queries .

© 2020-2025 乐筑天下

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