乐筑天下

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

[编程交流] 提取某些属性

[复制链接]

4

主题

29

帖子

25

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 15:56:54 | 显示全部楼层 |阅读模式
嘿伙计们,
 
在我工作的地方,我们传输DWG。与我们的客户一起完成每项工作,因此当我们获得DWG时。在中,我们必须手动登录每个人,并记录各种信息。
 
我想知道是否有可能创建一个应用程序,visual lisp或vba,可以进入DWG组。,从块“TITLE”中获取文件名和三个属性(DWGNO、Disc1和REVISION),然后将它们放入excel工作表中。实际上,我只需要代码来进入一组DWG。(从未编写过可以同时处理多个DWG的代码)以及提取该数据所需的代码。我想如果我知道怎么做,我可以很好地把它拼凑起来。
 
提前感谢您的帮助!
回复

使用道具 举报

0

主题

132

帖子

198

银币

限制会员

铜币
-21
发表于 2022-7-6 16:04:31 | 显示全部楼层
简而言之,答案是肯定的。你从哪里开始?你有什么东西吗?脚本是否足够?
回复

使用道具 举报

4

主题

29

帖子

25

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 16:07:13 | 显示全部楼层
请原谅我的无知,我远没有这个论坛上的大多数人好。
 
脚本在这里有什么用处?我的理解是,不能用脚本读取信息,也不能在多个DWG中运行脚本。除非你打开每一个并手动运行?
 
现在我有一个粗略的草图,我认为程序应该如何在VBA中运行(在VBA中几乎没有经验),到目前为止几乎没有实际代码。
 
我想我将从一个包含我的计算机目录的对话框开始,这样我可以选择我需要的dwg文件(这可能吗),然后它应该按顺序打开它们,从标题栏中获取文件名和属性信息,所有这些都在模型空间中,并将它们打印到excel表的第1行,然后循环浏览dwg。在excel工作表上为每个dwg向下搜索一行。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 16:16:48 | 显示全部楼层
可以使用脚本打开任意多个图形,然后在该脚本中执行多个功能。我可以向你们保证,我在一次会议中打开了大约120个DWG,你们会惊讶于它的速度有多快。
 

checkexcelrunning(检查excel是否正在运行)
打开dwg1 myprog1 close N
打开dwg2 myprog1关闭N
打开dwg3 myprog1 close N
打开dwg4 myprog1 close N
 
(check for excel is running)是一个这样做的程序,这里有许多使用VBA检查excel是否打开的示例。
 
Myprog1是一个将属性写入excel工作表的小程序。
 
这里有很多示例可以让您编写myprog1。因为您知道哪个块包含dwgno disc1修订版,所以这很容易。在查看数据库时,模型空间图纸空间保存图形的位置无关紧要,它会找到块。值得注意的是,我们在大多数DWG中都有多个布局,版次不能在布局之间更改。但你可以导出每张纸的细节,这可能是最好的。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 16:20:23 | 显示全部楼层
除此之外,这里是更新名为“titleblock”的块的代码,我已经注意到了将属性导出到excel的点。这是一个开始。
 
  1. Public Sub issued_for_construction()
  2. ' This Updates the Issued for construction and sets rev 0
  3. Dim SS As AcadSelectionSet
  4. Dim Count As Integer
  5. Dim FilterDXFCode(1) As Integer
  6. Dim FilterDXFVal(1) As Variant
  7. Dim attribs As Variant
  8. Dim BLOCK_NAME As String
  9. On Error Resume Next
  10. FilterDXFCode(0) = 0
  11. FilterDXFVal(0) = "INSERT"
  12. FilterDXFCode(1) = 2
  13. FilterDXFVal(1) = "titleblock"
  14. BLOCK_NAME = "titleblock"
  15. Set SS = ThisDrawing.SelectionSets.Add("issued")
  16. SS.Select acSelectionSetAll, , , FilterDXFCode, FilterDXFVal
  17. For Cntr = 0 To SS.Count - 1
  18.   attribs = SS.Item(Cntr).GetAttributes
  19.       
  20. '   take these next 4 lines out and add your export to excel here !
  21.        attribs(0).TextString = "ISSUED FOR CONSTRUCTION"
  22.        attribs(3).TextString = "0"
  23.       
  24.        attribs(0).Update
  25.        attribs(3).Update
  26.       
  27. Next Cntr
  28. ThisDrawing.SelectionSets.Item("issued").Delete
  29. 'DO AGAIN FOR REVTABLE
  30. 'DATE
  31. 'Dim MyDate
  32. 'MyDate = Date
  33. Call DashDate
  34. FilterDXFCode(1) = 2
  35. FilterDXFVal(1) = "REVTABLE"
  36. BLOCK_NAME = "REVTABLE"
  37. Set SS = ThisDrawing.SelectionSets.Add("revs")
  38. SS.Select acSelectionSetAll, , , FilterDXFCode, FilterDXFVal
  39. For Cntr = 0 To SS.Count - 1
  40.   attribs = SS.Item(Cntr).GetAttributes
  41.       
  42.       
  43.        attribs(0).TextString = "0"
  44.        attribs(1).TextString = DashDate
  45.        attribs(2).TextString = "ISSUED FOR CONSTRUCTION"
  46.       
  47.       
  48.       
  49.        attribs(0).Update
  50.        attribs(1).Update
  51.        attribs(2).Update
  52.       
  53. Next Cntr
  54. ThisDrawing.SelectionSets.Item("revs").Delete
  55. MsgBox "Drawing now changed to Issued for Construction"
  56. End Sub
  57. Public Function DashDate() As String
  58.    Dim strDate As String
  59.    Dim intMonth As Integer
  60.    Dim intDay As Integer
  61.    strDate = Str(Date)
  62.    intMonth = InStr(1, strDate, "/", vbTextCompare)
  63.    intDay = InStr(intMonth, strDate, "/", vbTextCompare)
  64.    strDate = Left(strDate, intMonth - 1) & "." _
  65.            & Mid(strDate, intMonth + 1, intDay - 1) & "." & Right(strDate, 2)
  66.    DashDate = strDate
  67. End Function
回复

使用道具 举报

4

主题

29

帖子

25

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 16:24:15 | 显示全部楼层
 
谢谢,我明天会在工作中编写这段代码,看看结果如何。可能需要更多帮助,因为我想在开始时在vba中打开一个对话框,在那里我可以选择DWG所在的目录。是的,它可以完成所有的操作,但是当我试图添加一个微软通用对话框(我被告知这是我需要的)时,它说我没有权限。我明天也得做这件事。谢谢大家!
回复

使用道具 举报

18

主题

434

帖子

422

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
94
发表于 2022-7-6 16:27:38 | 显示全部楼层
请阅读此处:http://www.cadtutor.net/forum/showthread.php?t=1950
回复

使用道具 举报

4

主题

29

帖子

25

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 16:36:01 | 显示全部楼层
谢谢Fuccaro,看起来你的程序会帮我很多!
回复

使用道具 举报

4

主题

29

帖子

25

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 16:37:57 | 显示全部楼层
Fuccaro,
 
感谢一位配载员,这段代码非常有效。我计划一有机会就把它改成我需要的excel表格上的格式。我只有一个问题,那不是你程序的错。出于某种原因,当我在我的一个公司标题栏上使用它时,它会在excel表中返回多行。有时5,有时17!当我在另一种类型的区块上使用它时(我在我自己放入dwg的其他区块上进行了尝试),它工作得很好,只打印出一行。我试图弄明白为什么它在dwg上只能找到它的一个实例时,却如此多次地拾取我们的标题栏。我附上一份标题栏的副本,它有问题。如果有人能告诉我如何解决这个问题,或者告诉我我的公司标题栏出了什么问题,我将永远感激!
 
块名为“DTITLE”,我试图获取属性“REVNO”和“DWGNO”。
 
***我将附上图纸。我在下一篇文章中谈到的你的文件和代码,因为直到我第9篇文章发表之前,它都不允许我发布它们
回复

使用道具 举报

4

主题

29

帖子

25

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 16:45:23 | 显示全部楼层
42-07-05-020841-RSS#420-2450苯胺日计量箱(MQP)上的电导率分析仪。图纸
  1. ; Global ATTribute EXtractor
  2. ; by Miklos Fuccaro mfuccaro@hotmail.com
  3. ;-------------------------November 2004 -------
  4. ;;Edited March 2006 by C. Bassler to allow specification of block and tage names to extract
  5. (defun gattex()
  6.   (setq Blocklist '("DTITLE"));; ** edit to include block names to select
  7.   (setq TagList '("DWGNO." "REVNO."));; ** edit to include tag names to extract
  8.   ;;create block names separated by columns, for selection filter
  9.   (setq Blocknames (List2String BlockList))
  10.   (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 BlockNames))))
  11.   (if (not ss) (quit))
  12.   (setq Root (getvar "DWGPREFIX"))
  13.   (setq file (open (strcat Root "attributes.CSV") "a") i -1)
  14.   (write-line (strcat Root (getvar "DWGNAME")
  15.                " -found " (itoa (sslength ss))
  16.                " block(s) with attributes") file)
  17.   (repeat (sslength ss)
  18.       (setq TagRow nil ValRow nil)
  19.       (setq Edata (entget (setq e (ssname ss (setq i (1+ i))))))
  20.       (write-line "" file)
  21.       (write-line (strcat "block name:" "," (Dxf 2 Edata)) file)
  22.       (while (/= (Dxf 0 Edata) "SEQEND")
  23.          (if
  24.              (and
  25.                  (= (Dxf 0 Edata) "ATTRIB")
  26.                  (member (dxf 2 Edata) TagList);;if tag is on list
  27.              );and
  28.              (progn
  29.                  (setq TagRow (cons (Dxf 2 Edata) TagRow))
  30.                  (setq valRow (cons (Dxf 1 Edata) ValRow))
  31.              );progn
  32.          )
  33.          (setq Edata (entget (setq e (entnext e))))
  34.       );while
  35.       (write-line (List2String (reverse TagRow)) file)
  36.       (write-line (List2String (reverse ValRow)) file)
  37.   );repeat
  38.   (close file)
  39.   (princ (strcat "\nDone writing file " Root "attributes.csv"))
  40.   (princ)
  41. );defun
  42. ;;-------------------------------
  43. (defun List2String (Alist)
  44.   (setq NumStr (length Alist))
  45.      (foreach Item AList
  46.         (if (= Item (car AList));;first item
  47.            (setq LongString (car AList))
  48.            (setq LongString (strcat LongString "," Item))
  49.          )
  50.      )
  51.   LongString
  52. );defun
  53. ;;--------------------------------
  54. (defun Dxf (code pairs)
  55.   (cdr (assoc code pairs))
  56. )
  57. (gattex)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 20:07 , Processed in 0.437338 second(s), 83 queries .

© 2020-2025 乐筑天下

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