乐筑天下

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

[编程交流] 向多段线和ex添加数据

[复制链接]

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-6 06:32:53 | 显示全部楼层 |阅读模式
你好
 
首先,我想祝大家新年快乐,但对一些人来说,这似乎不是最好的开始,祈祷你们的情况有所改善。
 
可能已经有一个线程的信息,我正在寻找,但我一直无法找到它。
 
我在寻找一个lisp文件或VB例程或帮助创建这样一个文件,。。。
 
在这里,我可以选择一条多段线(例如表示管道)&它会询问我
1号
它从哪里来?
 
&我可以手动输入数据或从中选择块,它将使用块名称作为数据。
 
Nr 2
它要去哪里?同样,我可以手动输入数据或从中选择一个块,它将使用块名称作为数据。
 
Nr 3
它将存储此信息以及多段线的宽度和多段线的图层,以便我可以将此信息提取到表中
 
在我的搜索过程中,我发现了几种向多边形中添加数据的方法,但不是通过使用数据提取方法来提取数据。它不必使用数据提取方法,但应该可以导出为表格格式
 
如果您能帮上忙,我们将不胜感激。
 
这应该适用于普通Autocad 2008以上版本。
 
希望我已经解释清楚了
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 06:37:12 | 显示全部楼层
我不知道你可以给折线添加额外的信息-我很想看看结果
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 06:41:32 | 显示全部楼层
非常简单的示例将数据写入和读取到多段线(或任何其他对象):
 
  1. (defun c:dwrite(/ plObj stBl enBl datLst)
  2. (vl-load-com)
  3. (if
  4.    (and
  5.      (setq plObj(entsel "\nSelect polyline to write > "))
  6.      (setq stBl(entsel "\nSelect 'start' block > "))
  7.      (setq enBl(entsel "\nSelect 'end' block > "))
  8.      ); end and
  9.    (progn
  10.    (setq plObj(vlax-ename->vla-object(car plObj))
  11.   stBl(cdr(assoc 2(entget(car stBl))))
  12.   enBl(cdr(assoc 2(entget(car enBl))))
  13.   datLst(list(cons 1 stBl)(cons 2 enBl))
  14.   ); end setq
  15.    (vlax-ldata-put plObj "Pipe Data" datLst)
  16.    ); end progn
  17.   );end if
  18. (princ)
  19. ); c:dwrite
  20. (defun c:dread(/ rObj datLst)
  21. (vl-load-com)
  22. (if(and
  23.       (setq rObj(entsel "\nSelect polyline to read > "))
  24.       (setq datLst(vlax-ldata-get(car rObj) "Pipe Data"))
  25.       ); and
  26.    (alert(strcat "Start block: "(cdr(assoc 1 datLst))
  27.                  "\n\nEnd block: "(cdr(assoc 2 datLst))))
  28.    (alert "\nNo data found. ")
  29.    ); end if
  30. (princ)
  31. ); end of c:dread
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 06:44:32 | 显示全部楼层
干杯,阿斯米,很高兴知道
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 06:46:48 | 显示全部楼层
带有超链接提示的新变体,并将数据保存到*。csv文件。DWRITE-将数据添加到多段线,DCOLLECT-读取到*。csv文件(用MS Excel打开)。
 
  1. (defun c:dwrite(/ plObj stBl enBl datLst cAns hyObj)
  2. (if
  3.    (and
  4.      (setq plObj(entsel "\nSelect polyline to write > "))
  5.      (setq stBl(entsel "\nSelect 'Begin' block > "))
  6.      (setq enBl(entsel "\nSelect 'End' block > "))
  7.      ); end and
  8.    (progn
  9.    (setq plObj(vlax-ename->vla-object(car plObj))
  10.   stBl(cdr(assoc 2(entget(car stBl))))
  11.   enBl(cdr(assoc 2(entget(car enBl))))
  12.   datLst(list(cons 1 stBl)(cons 2 enBl))
  13.   hyObj(vla-get-Hyperlinks plObj)
  14.   ); end setq
  15.    (if(vlax-ldata-get plObj "Pipe Data")
  16.      (progn
  17. (initget "Yes No")
  18. (setq cAns(getkword "\nPipe data already exists. Overwrite? [Yes/No]: "))
  19. (if(= "Yes" cAns)
  20.   (progn
  21.    (vlax-ldata-delete plObj "Pipe Data")
  22.    (vlax-ldata-put plObj "Pipe Data" datLst)
  23.    (vla-Delete(vla-Item hyObj 0))
  24.    (vla-Add hyObj "Has Pipe Data" (strcat "Pipe: " stBl " --> " enBl))
  25.    (princ "\nData successfuly added ")
  26.    );end progn
  27.   ); end if
  28. ); end progn
  29.      (progn
  30.       (vlax-ldata-put plObj "Pipe Data" datLst)
  31.       (vla-Add hyObj "Has Pipe Data" (strcat "Pipe: " stBl " --> " enBl))
  32.       (princ "\nData successfuly added ")
  33.       ); end progn
  34.      ); end if
  35.    ); end progn
  36.   );end if
  37. (princ)
  38. ); c:dwrite
  39. (defun c:dcollect(/ plSet oLst cDat fName cAns exApp wbCol cDoc)
  40. (if(setq plSet(ssget "_X" '((0 . "LWPOLYLINE"))))
  41.    (progn
  42.      (foreach pl (mapcar 'vlax-ename->vla-object
  43.                     (vl-remove-if 'listp
  44.                       (mapcar 'cadr(ssnamex plSet))))
  45. (if(setq cDat(vlax-ldata-get pl "Pipe Data"))
  46.   (progn
  47.     (setq oLst(cons
  48.                 (list
  49.                      (vla-get-ConstantWidth pl)
  50.                      (vla-get-Layer pl)
  51.                      (cdr(assoc 1 cDat))
  52.                      (cdr(assoc 2 cDat))
  53.                     ); end list
  54.               oLst); end cons
  55.           ); end setq
  56.     ); end progn
  57.   ); end if
  58. ); end foreach
  59.      (if oLst
  60. (progn
  61.   (setq fDescr(open
  62.                 (setq fName(strcat(vl-filename-directory(getvar "SAVENAME"))
  63.                   "\"(vl-filename-base(getvar "DWGNAME")) ".csv")) "w"))
  64.   (write-line "Diameter;Layer;From;To" fDescr)
  65.   (foreach itm (reverse oLst)
  66.       (write-line (strcat(rtos(car itm))
  67.                          ";" (cadr itm)
  68.                          ";" (nth 2 itm)
  69.                          ";" (last itm))
  70.         fDescr)
  71.     ); end foreach
  72.   (close fDescr)
  73.   (princ(strcat "\nCSV file location: " fName ))
  74.   (initget "Yes No")
  75.   (setq cAns(getkword "\nOpen file [Yes/No]: "))
  76.   (if(= cAns "Yes")
  77.     (if(setq exApp(vlax-get-or-create-object "Excel.Application"))
  78.       (progn
  79.         (vlax-put-property exApp 'Visible :vlax-true)
  80.         (setq wbCol(vlax-get-property exApp 'Workbooks)
  81.               cDoc(vlax-invoke-method wbCol 'Open fName))
  82.         (vlax-release-object cDoc)
  83.         (vlax-release-object wbCol)
  84.         (vlax-release-object exApp)
  85.         ); end progn
  86.       ); end if
  87.     ); end if
  88.   ); end progn
  89. ); end if
  90.      ); end progn
  91.    ); end if
  92. (princ)
  93. ); end of c:dtable
  94. (vl-load-com)

 
Hiperlinks只是带有管道方向的提示,CTRL+单击不起作用。它显示了数据如何仅存在。
回复

使用道具 举报

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-6 06:50:24 | 显示全部楼层
谢谢Asmi,
 
太棒了!!你总是让我惊讶,这是肯定的。我已经测试了你的修订版本。当然,只有在测试之后,我才意识到我应该首先考虑的额外的几点。我将列出几点,如果你有时间可以实现它们,如果你可以在lisp文件中添加注释来显示你是如何进行更改的,那就更好了。
 
1、不总是有开始块,也不总是有结束块。当没有可供选择的块时,是否可以将该数据作为文本字符串输入?
 
2、这里是我的错,但我完全忘记了我需要导出的主要数据之一。这是多段线的长度
 
3.在导出过程中,是否可以将constantwidth乘以1000,并在数字前加上DN(例如,宽度恒定为0.2的多段线将导出为DN 200。这并不太重要,因为我可以在excel中作为宏的一部分来格式化.csv文件。但很高兴看到它是如何实现的。
 
4、这只是我在测试时想到的。是否可以创建一个选项来请求管道材料?如果材料未知,则记录默认值“不可用”?
 
1和2是需要的,3和4是一个愿望,如果这样的事情是允许的,将不胜感激。
 
再次感谢阿斯米,
 
费尔格特
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 06:52:44 | 显示全部楼层
阿斯米,你是个天才。
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 06:57:46 | 显示全部楼层
我似乎已经实现了你的愿望,但可能会有错误,因为它的'飞行'的代码。它没有受到严格的检查。在代码开头修改材料列表和默认材料。与之前一样的命令DWRITE和DCOLLECT。可能有必要提供删除数据和超链接的命令,但现在不是这样。
 
  1. (defun c:dwrite(/ plObj stBl enBl datLst cAns hyObj okFlg cMat mLst mNum)
  2. ; ************ MODIFY LIST OF MATERIALS ************
  3. (setq mLst '(
  4.        (0 . "N/A")
  5.        (1 . "DIN 2391")
  6.        (2 . "DIN 2392")
  7.        (3 . "DIN 2394")
  8.        )
  9. ); end setq
  10. ; ************ MODIFY DEFAULT MATERIAL ************
  11. (if(not dwrite:material)
  12.     (setq dwrite:material "N/A")
  13.    ); end if
  14. (defun Entsel_or_Text(Spaces Message / lChr tStr grLst filPt
  15.                 selSet outVal pSps)
  16. (princ Message)
  17. (setq tStr ""); end setq
  18. (if Spaces
  19.    (setq pSps(list "\r"))
  20.    (setq pSps(list " " "\r"))
  21.    ); end if
  22.   (while
  23.      (and
  24.        (not(member lChr pSps))
  25. (/= 3(car grLst))
  26.        ); end and
  27.      (if
  28.        (setq grLst(grread nil 4 2))
  29.        (progn
  30.         (cond
  31.          ((= 3(car grLst))
  32.           (setq filPt(cadr grLst)
  33.                 selSet(ssget filPt)
  34.                 ); end setq
  35.           (if selSet
  36.                (setq outVal
  37.                (list(ssname selSet 0)filPt))
  38.             ); end if
  39.           ); end condition #1
  40.   ((or
  41.      (equal '(2 13) grLst)
  42.      (equal 25(car grLst))
  43.      ); end or
  44.     (setq lChr "\r"
  45.           outVal tStr); end setq
  46.    ); end condition #2
  47.   ((and
  48.      (equal '(2  grLst)
  49.      (< 0(strlen tStr))
  50.      ); end and
  51.    (setq tStr(substr tStr 1(1-(strlen tStr))))
  52.    (princ(strcat(chr (chr 32)(chr ))
  53.    ); end condition #3
  54.          ((and
  55.      (= 2(car grLst))
  56.      (<= 32(cadr grLst)126)
  57.      ); end and
  58.           (setq lChr(chr(cadr grLst)))
  59.           (if(not(member lChr pSps))
  60.                 (progn
  61.                 (setq tStr(strcat tStr lChr)
  62.                       outVal tStr); end setq
  63.             (princ lChr)
  64.           ); end progn
  65.          ); end if
  66.         ); end condition #4
  67.        ); end cond
  68.       ); end progn
  69.      ); end if
  70.     ); end while
  71.    outVal
  72. ); end of Entsel_or_Text
  73. (while(not okFlg)
  74.    (princ(strcat "\nCurrent material = " dwrite:material))
  75.    (setq plObj(Entsel_or_Text T "\nSelect polyline or [Material]: "))
  76.    (cond
  77.      ((and
  78.   (= 'LIST(type plObj))
  79.   (= "LWPOLYLINE"(cdr(assoc 0(entget(car plObj)))))
  80. ); end and
  81.       (setq plObj(car plObj)
  82.      okFlg T); end setq
  83.       ); end condition #1
  84.      ((= 'LIST(type plObj))
  85.       (princ "\nThis isn't LwPolyline! ")
  86.       ); end condition #2
  87.      ((and
  88. (= 'STR(type plObj))
  89. (member(strcase plObj) '("M" "_M" "MATERIAL" "_MATERIAL"))
  90. ); end and
  91.       (textscr)
  92.       (princ "\n====== MATERIAL LIST ======")
  93.       (foreach m mLst
  94. (princ(strcat "\n[" (itoa(car m)) "] - "(cdr m)))
  95. ); end foreach
  96.       (princ "\n===========================")
  97.       (setq mNum(getint "\nSelect material from list: "))
  98.       (if(and mNum(setq cMat(assoc mNum mLst)))
  99. (progn
  100.    (setq dwrite:material(cdr cMat))
  101.    (graphscr)
  102.    ); end progn
  103. (princ "\nCan't find material with this number! ")
  104. ); end if
  105.       ); end condition #3
  106.      ((null plObj)
  107.        (princ "\nEmpty selection! ")
  108.       ); end condition #4
  109.      (T
  110.       (princ "\nInvalid keyword option! ")
  111.       ); end condition #5
  112.      ); end cond
  113.    ); end while
  114. (while(not stBl)
  115.    (setq stBl(Entsel_or_Text T "\nSelect 'Begin' block or type name: "))
  116.    (cond
  117.      ((and
  118. (= 'LIST(type stBl))
  119. (= "INSERT"(cdr(assoc 0(entget(car stBl)))))
  120. ); end and
  121.        (setq stBl(cdr(assoc 2(entget(car stBl)))))
  122.       ); end condition #1
  123.      ((= 'LIST(type stBl))
  124.        (princ "\nThis isn't block! ")
  125.        (setq stBl nil)
  126.       ); end condition #2
  127.      ((null stBl)
  128.       (princ "\nEmpty input! ")
  129.       ); end condition #3
  130.      ); end cond
  131.    ); end while
  132. (while(not enBl)
  133.    (setq enBl(Entsel_or_Text T "\nSelect 'End' block or type name: "))
  134.    (cond
  135.      ((and
  136. (= 'LIST(type enBl))
  137. (= "INSERT"(cdr(assoc 0(entget(car enBl)))))
  138. ); end and
  139.        (setq enBl(cdr(assoc 2(entget(car enBl)))))
  140.       ); end condition #1
  141.      ((= 'LIST(type enBl))
  142.        (princ "\nThis isn't block! ")
  143.        (setq enBl nil)
  144.       ); end condition #2
  145.      ((null enBl)
  146.       (princ "\nEmpty input! ")
  147.       ); end condition #3
  148.      ); end cond
  149.    ); end while
  150. (setq datLst(list(cons 1 stBl)(cons 2 enBl)(cons 3 dwrite:material))
  151. plObj(vlax-ename->vla-object plObj)
  152. hyObj(vla-get-Hyperlinks plObj)
  153. ); end setq
  154. (if(vlax-ldata-get plObj "PipeData")
  155.      (progn
  156. (initget "Yes No")
  157. (setq cAns(getkword "\nPipe data already exists. Overwrite? [Yes/No]: "))
  158. (if(= "Yes" cAns)
  159.   (progn
  160.    (vlax-ldata-delete plObj "PipeData")
  161.    (vlax-ldata-put plObj "PipeData" datLst)
  162.    (vla-Delete(vla-Item hyObj 0))
  163.    (vla-Add hyObj "Has Pipe Data" (strcat "Material: " dwrite:material))
  164.    (princ "\n<<< Data successfuly added >>> ")
  165.    );end progn
  166.   ); end if
  167. ); end progn
  168.      (progn
  169.       (vlax-ldata-put plObj "PipeData" datLst)
  170.       (vla-Add hyObj "Has Pipe Data" (strcat "Material: " dwrite:material))
  171.       (princ "\n<<< Data successfuly added >>> ")
  172.       ); end progn
  173.      ); end if       
  174. (princ)
  175. ); c:dwrite
  176. (defun c:dcollect(/ plSet oLst cDat fName cAns exApp wbCol cDoc)
  177. (if(setq plSet(ssget "_X" '((0 . "LWPOLYLINE"))))
  178.    (progn
  179.      (foreach pl (mapcar 'vlax-ename->vla-object
  180.                     (vl-remove-if 'listp
  181.                       (mapcar 'cadr(ssnamex plSet))))
  182. (if(setq cDat(vlax-ldata-get pl "PipeData"))
  183.   (progn
  184.     (setq oLst(cons
  185.                 (list
  186.                      (vla-get-ConstantWidth pl)
  187.                      (vla-get-Layer pl)
  188.                      (cdr(assoc 1 cDat))
  189.                      (cdr(assoc 2 cDat))
  190.                      (cdr(assoc 3 cDat))
  191.                      (vlax-curve-GetDistAtParam pl
  192.                        (vlax-curve-GetEndParam pl))
  193.                     ); end list
  194.               oLst); end cons
  195.           ); end setq
  196.     ); end progn
  197.   ); end if
  198. ); end foreach
  199.      (if oLst
  200. (progn
  201.   (setq fDescr(open
  202.                 (setq fName(strcat(vl-filename-directory(getvar "SAVENAME"))
  203.                   "\"(vl-filename-base(getvar "DWGNAME")) ".csv")) "w"))
  204.   (write-line "Diameter;Layer;From;To;Material;Length" fDescr)
  205.   (foreach itm (reverse oLst)
  206.       (write-line (strcat(rtos(* 1000.0(nth 0 itm)))
  207.                          ";" (nth 1 itm)
  208.                          ";" (nth 2 itm)
  209.                          ";" (nth 3 itm)
  210.                          ";" (nth 4 itm)
  211.                          ";" (rtos(nth 5 itm)))
  212.         fDescr)
  213.     ); end foreach
  214.   (close fDescr)
  215.   (princ(strcat "\nCSV file location: " fName ))
  216.   (initget "Yes No")
  217.   (setq cAns(getkword "\nOpen file [Yes/No]: "))
  218.   (if(= cAns "Yes")
  219.     (if(setq exApp(vlax-get-or-create-object "Excel.Application"))
  220.       (progn
  221.         (vlax-put-property exApp 'Visible :vlax-true)
  222.         (setq wbCol(vlax-get-property exApp 'Workbooks)
  223.               cDoc(vlax-invoke-method wbCol 'Open fName))
  224.         (vlax-release-object cDoc)
  225.         (vlax-release-object wbCol)
  226.         (vlax-release-object exApp)
  227.         ); end progn
  228.       ); end if
  229.     ); end if
  230.   ); end progn
  231. (princ "\nNo data found! ")
  232. ); end if
  233.      ); end progn
  234.    ); end if
  235. (princ)
  236. ); end of c:dcollect
  237. (vl-load-com)
回复

使用道具 举报

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-6 07:00:41 | 显示全部楼层
你好,阿斯米,
 
太棒了,我今天早上一直在测试
 
到目前为止,我只有两条值得注意的评论
 
1.在某些情况下,同一层上有1条以上的管道(多段线)从同一起始块到同一结束块,也可能具有相同的长度。问题是如何最好地区分管道?每个入口的单独管道ID在这里效果最好吗?
我在想一个类似于材料列表的东西,比如一个图层列表
 
第1层“01001”
第2层“02002”
 
然后,对于在第1层上选择的每个管道,第一个管道获得ID 01001,第二个管道获得01002,第三个管道获得01003,依此类推
 
这只是一个建议,因为我不知道这个问题最容易的解决方法是什么。根据你的经验,你很可能会对此有更好的想法或解决方案。
 
 
 
2.这一点与程序无关,只是一个更高的要求,以便使用lisp文件更容易。在超链接中,如果一个人也能读取所有数据,即层、长度和管道ID,那该多好?
目前正在显示
 
材料:不适用
 
我已经改变了这一点,它读你的原始版本也
 
stblk-->enblk?材料:不适用
 
我也尝试过,但没有成功,包括
 
stblk-->enblk _材料:不适用_层:XY _长度:10.50管道ID:0101
 
 
我非常感谢你迄今为止为我提供的一切。正如u在上次回复中所说,它还需要一种方法来删除超链接和通过lisp文件附加的数据。
 
在这方面也没有立即的匆忙,无论何时你抽出时间来做这件事都很快,我很感激你会有其他优先事项等等。
 
当做
 
费尔格特
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 07:04:02 | 显示全部楼层
 
每个实体都有唯一的ObjectID属性。事实是10个字符,你可能看起来很多。如果不合适,你可以考虑其他的。
 
 
不幸的是,超链接提示限制了标志的数量并对其进行了修剪。所以我只留下了ID、材质和长度。但现在可以使用DDATA命令查看所有属性。
 
 
使用DDELETE命令删除数据和超链接。
 
事实上,使用它还为时过早,因为它有许多缺点。例如,如果锁定层上的行DWRITE和DDELETE将生成错误。此外,更新超链接所需的命令可能会更改多段线。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 14:46 , Processed in 0.433150 second(s), 72 queries .

© 2020-2025 乐筑天下

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