乐筑天下

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

[编程交流] 从块中提取超链接

[复制链接]

15

主题

64

帖子

49

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-5 16:23:08 | 显示全部楼层 |阅读模式
大家好,
 
我已经创建了这个lisp,它工作得很好,但我需要一件事的帮助。这将从块中提取超链接,并按照您选择块的顺序将其导出到txt文件。
 
这是我的问题。显然,有两种方法可以向块添加超链接。您可以通过块编辑器将其添加到属性窗格(图1)中,也可以将其添加到块外部。(图2)希望是有道理的。
 
如果超链接在外面,下面的例程就会起作用,当然,我所有的块都在里面。
 
如何修改此选项以提取“嵌套”超链接?
 
我还注意到,如果取消txt保存对话框,会出现以下错误:;错误:错误的参数类型:stringp nil
我不知道为什么。。。
 
  1. (defun c:test6 (/ )
  2. (vl-load-com)
  3. (setq File1 (getfiled "Save File" (strcat "Export - "(menucmd "M=$(edtime,$(getvar,date),MO-DD-YYYY)")) "txt" 1))
  4. (setq Fopen (open File1 "w"))
  5. (setq ss_mm (ssget (list (cons 0 "INSERT"))))
  6. (setq Ecount 0)
  7. (repeat (sslength ss_mm)
  8.                
  9.         (setq mm_obj (vlax-ename->vla-object (ssname ss_mm Ecount)))
  10.         (setq mm_txt (vlax-get-property mm_obj 'Hyperlinks))
  11.        
  12.                 (progn
  13.                        
  14.                 (vlax-for each mm_txt
  15.                 (setq hyp_txt (strcat (vla-get-url each)))
  16.                 (write-line hyp_txt Fopen)
  17.                 (setq Ecount (1+ Ecount))
  18.                
  19.                 )
  20.                 )
  21. )
  22. (close Fopen)
  23. (princ)
  24. )

 
图1
172311bqec7c1eqahhq7pg.png
 
图2
172312it5ecz15tcyclc3w.png
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:29:43 | 显示全部楼层
 
请注意,当使用ssget获取选择时,不能依赖集合中实体的顺序与选择顺序匹配(考虑窗口/交叉/多边形/组选择)。
 
 
因为在将值提供给打开函数之前,您没有测试GetField函数是否返回了字符串值。如果用户在提示时单击“取消”,则GetField将返回nil,因此,当提供空文件名参数时,open函数将出错。
 
我建议如下:
  1. ([color=BLUE]defun[/color] c:hypex ( [color=BLUE]/[/color] des ent hyp lst txt url )
  2.    ([color=BLUE]setq[/color] hyp ([color=BLUE]lambda[/color] ( ent ) ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 1000 ([color=BLUE]cdadr[/color] ([color=BLUE]assoc[/color] -3 ([color=BLUE]entget[/color] ent '([color=MAROON]"pe_url"[/color]))))))))
  3.    ([color=BLUE]while[/color]
  4.        ([color=BLUE]not[/color]
  5.            ([color=BLUE]progn[/color] ([color=BLUE]setvar[/color] 'errno 0) ([color=BLUE]setq[/color] ent ([color=BLUE]car[/color] ([color=BLUE]entsel[/color] [color=MAROON]"\nSelect block <done>: "[/color])))
  6.                ([color=BLUE]cond[/color]
  7.                    (   ([color=BLUE]=[/color] 7 ([color=BLUE]getvar[/color] 'errno))
  8.                        ([color=BLUE]prompt[/color] [color=MAROON]"\nMissed, try again."[/color])
  9.                    )
  10.                    (   ([color=BLUE]null[/color] ent))
  11.                    (   ([color=BLUE]/=[/color] [color=MAROON]"INSERT"[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 ([color=BLUE]entget[/color] ent))))
  12.                        ([color=BLUE]prompt[/color] [color=MAROON]"\nThe selected object is not a block."[/color])
  13.                    )
  14.                    (   ([color=BLUE]not[/color] ([color=BLUE]setq[/color] url ([color=BLUE]cond[/color] ((hyp ent)) ((hyp ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 330 ([color=BLUE]entget[/color] ([color=BLUE]tblobjname[/color] [color=MAROON]"block"[/color] (LM:name->effectivename ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 2 ([color=BLUE]entget[/color] ent)))))))))))))
  15.                        ([color=BLUE]prompt[/color] [color=MAROON]"\nThe selected block does not contain a hyperlink."[/color])
  16.                    )
  17.                    (   ([color=BLUE]=[/color] [color=MAROON]""[/color] url)
  18.                        ([color=BLUE]prompt[/color] [color=MAROON]"\nThe hyperlink for the selected block is linked to a view."[/color])
  19.                    )
  20.                    (   ([color=BLUE]setq[/color] lst ([color=BLUE]cons[/color] url lst))
  21.                        ([color=BLUE]prompt[/color] ([color=BLUE]strcat[/color] [color=MAROON]"\nURL = "[/color] url))
  22.                    )
  23.                )
  24.            )
  25.        )
  26.    )
  27.    ([color=BLUE]if[/color] ([color=BLUE]and[/color] lst ([color=BLUE]setq[/color] txt ([color=BLUE]getfiled[/color] [color=MAROON]""[/color] ([color=BLUE]strcat[/color] [color=MAROON]"Export - "[/color]([color=BLUE]menucmd[/color] [color=MAROON]"M=$(edtime,0,MO-DD-YYYY)"[/color])) [color=MAROON]"txt"[/color] 1)))
  28.        ([color=BLUE]if[/color] ([color=BLUE]setq[/color] des ([color=BLUE]open[/color] txt [color=MAROON]"w"[/color]))
  29.            ([color=BLUE]progn[/color]
  30.                ([color=BLUE]foreach[/color] url ([color=BLUE]reverse[/color] lst) ([color=BLUE]write-line[/color] url des))
  31.                ([color=BLUE]close[/color] des)
  32.            )
  33.            ([color=BLUE]princ[/color] ([color=BLUE]strcat[/color] [color=MAROON]"\nUnable to open "[/color] txt [color=MAROON]" for writing."[/color]))
  34.        )
  35.    )
  36.    ([color=BLUE]princ[/color])
  37. )
  38. [color=GREEN];; Block Name -> Effective Block Name  -  Lee Mac[/color]
  39. [color=GREEN];; blk - [str] Block name[/color]
  40. ([color=BLUE]defun[/color] LM:name->effectivename ( blk [color=BLUE]/[/color] rep )
  41.    ([color=BLUE]if[/color]
  42.        ([color=BLUE]and[/color] ([color=BLUE]wcmatch[/color] blk [color=MAROON]"`**"[/color])
  43.            ([color=BLUE]setq[/color] rep
  44.                ([color=BLUE]cdadr[/color]
  45.                    ([color=BLUE]assoc[/color] -3
  46.                        ([color=BLUE]entget[/color]
  47.                            ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 330 ([color=BLUE]entget[/color] ([color=BLUE]tblobjname[/color] [color=MAROON]"block"[/color] blk))))
  48.                           '([color=MAROON]"AcDbBlockRepBTag"[/color])
  49.                        )
  50.                    )
  51.                )
  52.            )
  53.            ([color=BLUE]setq[/color] rep ([color=BLUE]handent[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 1005 rep))))
  54.        )
  55.        ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 2 ([color=BLUE]entget[/color] rep)))
  56.        blk
  57.    )
  58. )
  59. ([color=BLUE]princ[/color])
回复

使用道具 举报

15

主题

64

帖子

49

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-5 16:33:54 | 显示全部楼层
嘿,李,
 
非常感谢你。你的日常活动很棒。但它仍然只拉外部超链接。不是嵌套在块中的那个。。。有什么想法吗?我似乎找不到这方面的任何东西。
 
谢谢你的帮助!!!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:38:06 | 显示全部楼层
它在我的测试中效果很好-请上传一个样本图。
回复

使用道具 举报

15

主题

64

帖子

49

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-5 16:41:32 | 显示全部楼层
当然没问题,附件。
 
我想我缩小了问题的范围。。。
 
在创建示例图形时,我发现您的例程工作正常、嵌套或在外部。所以我开始研究不同之处。我的区块包含动态功能。只要我添加了一些动态功能。您的例程不再适用于嵌套超链接。
 
我相信这与我最近学习的动态块、块名和块真名有关*U69与海平。只是猜测而已。
 
再次感谢你。
 
超链接测试。图纸
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:46:48 | 显示全部楼层
这就是为什么我不依赖组码2,这是动态块可能性的原因:
  1. (if (wcmatch (setq n (cdr (assoc 2 (entget ent)))) "`*U*")
  2. (setq n (vla-get-EffectiveName (vlax-ename->vla-object ent)))
  3. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:48:57 | 显示全部楼层
是的,动态块-我现在已经更新了我的上述代码。
回复

使用道具 举报

15

主题

64

帖子

49

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-5 16:52:08 | 显示全部楼层
谢谢Grrr和李,我真的很感激。最后一个问题。。。
 
我知道这违背了李所说的选择,但只是为了我自己的启发;如果我使用Lee的LM:ssget,我将如何将有效名称的解决方案合并到以下内容中:
 
  1. (setq ss_dtl
  2. (LM:ssget "\nSelect details in order for export or [Fence]: "
  3. (list "_:L"
  4. (append '((0 . "INSERT"))
  5. ((lambda ( / def lst )(while (setq def (tblnext "block" (null def)))
  6. (if (= 4 (logand 4 (cdr (assoc 70 def)))) (setq lst (vl-list* "," (cdr (assoc 2 def)) lst))))
  7. (if lst (list '(-4 . "<NOT") (cons 2 (apply 'strcat (cdr lst))) '(-4 . "NOT>")))))
  8. (if (= 1 (getvar 'cvport)) (list (cons 410 (getvar 'ctab))) '((410 . "Model"))))))
  9. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:55:58 | 显示全部楼层
我不认为只有使用ssget过滤器才能过滤入/出动态块。。
是的,您可以找到哪些块名称定义是动态的,并将其包含在过滤器中,但它不会选择具有注释性名称的动态块参照。
 
因此,我将迭代选择集并删除外部参照块。。
  1. (repeat (setq idx (sslength ss_dtl))
  2. (setq e (ssname ss_dtl (setq idx (1- idx))))
  3. (setq o (vlax-ename->vla-object e))
  4. (and (eq :vlax-true (vla-get-IsXref o)) (ssdel ss_dtl e) )
  5. )

 
你的问题让我问李:
如何使用vanilla确定块定义是否是动态的?
回复

使用道具 举报

15

主题

64

帖子

49

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-5 17:00:23 | 显示全部楼层
吼叫声
 
所以我会注射/替换我的重复是?
 
  1. (defun c:mcdldlf ( / ss_dtl dtl_export dtl_export_open dtl_count dtl_obj dtl_hyp each hyp_txt )
  2. (if (and
  3.                 (setq ss_dtl
  4.                         (LM:ssget "\nSelect details in order for export or [Fence]: "
  5.                                
  6.                                 (list "_:L"
  7.                                        
  8.                                         (append '((0 . "INSERT"))
  9.                                                
  10.                                                 (
  11.                                                        
  12.                                                         (lambda ( / def lst )
  13.                                                                 (while (setq def (tblnext "block" (null def)))
  14.                                                        
  15.                                                                         (if (= 4 (logand 4 (cdr (assoc 70 def)))) (setq lst (vl-list* "," (cdr (assoc 2 def)) lst)))
  16.                                                                 )
  17.                               
  18.                                                                         (if lst (list '(-4 . "<NOT") (cons 2 (apply 'strcat (cdr lst))) '(-4 . "NOT>")))
  19.                                                         )
  20.                                                 )
  21.                                                         (if (= 1 (getvar 'cvport)) (list (cons 410 (getvar 'ctab))) '((410 . "Model")))
  22.                                         )
  23.                                 )
  24.            
  25.                         )
  26.        
  27.                 )
  28.    
  29.                 (setq dtl_export (getfiled "Save Export File" (strcat "Export - "(menucmd "M=$(edtime,$(getvar,date),MO-DD-YYYY)")) "txt" 1))
  30.                 (setq dtl_export_open (open dtl_export "w"))
  31.   
  32.        )
  33.        (progn
  34.            
  35.            (setq dtl_count 0)
  36.            (repeat (sslength ss_dtl)
  37.                         (setq dtl_obj (vlax-ename->vla-object (ssname ss_dtl dtl_count)))
  38.                         (setq dtl_hyp (vlax-get-property dtl_obj 'Hyperlinks))
  39.                                 (vlax-for each dtl_hyp
  40.                                         (setq hyp_txt (strcat (vla-get-url each)))
  41.                                         (write-line hyp_txt dtl_export_open)
  42.                
  43.                                 )
  44.                         (setq dtl_count (1+ dtl_count))
  45.            )
  46.         (close dtl_export_open)
  47.        (princ (strcat "\nA hyperlink from " (itoa dtl_count) " Detail(s) has been exported to a .txt file."))
  48.        )
  49.    )
  50. (princ)
  51. )
  52. (defun LM:ssget ( msg arg / sel )
  53.    (princ msg)
  54.    (setvar 'nomutt 1)
  55.    (setq sel (vl-catch-all-apply 'ssget arg))
  56.    (setvar 'nomutt 0)
  57.    (if (not (vl-catch-all-error-p sel)) sel)
  58. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-6 05:20 , Processed in 0.981418 second(s), 75 queries .

© 2020-2025 乐筑天下

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