乐筑天下

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

[编程交流] Auto cad-->excel

[复制链接]

1

主题

8

帖子

7

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 22:20:26 | 显示全部楼层
嗨seant
 
我试着用vba编码,但显示所有的多段线。。。
 
我需要。。。“在excel工作表中显示选定多段线(按图层)的属性。。
 
我从这里得到了一个用于多段线测量的lisp文件(名称:-“zone”)。。它给出了选定多段线的总面积/长度(逐层)。。
 
你能根据lisp编码PLSSS进行vba编码吗?
 
在这里,我添加了lisp编码,我在这里得到的形式。。。。。。。。。。。
 
; 按层测量多段线的面积和长度
; 适用于轻型(优化)多段线和旧格式多段线
; PLINETYPE系统变量不受影响
;
; David Watson 1995,2003年更新
;
(定义c:区域(/ssl aret pert)
(princ“\n点击所需层上的任何对象”)
(setq ssl(ssget))
(if(=ssl nil)(princ“\n***未选择任何内容!***\n\n”)
(程序
(setq lay(cdr(assoc 8(entget(ssname ssl 0 1070;)Ю))))
(setq ssl(ssget“X”(列表(cons 8层)))
(princ(strcat“LAYER”lay“selected”))
(initget“长度区域”)
(setq res(getkword“\n您想测量长度/:”)
(if(=res“长度”)(mlen)(meas))
);结束程序
);如果结束
(普林斯)
);结束区域
(defun meas()
(setq len(sslength ssl))
(setq alen(sslength ssl))
(setq aret 0)
(setq计数0)
(setq nop 0)
(setq ope 0)
(while(/=长度计数)
(setq pnt(ssname ssl计数))
(setq ple(cdr(assoc 0(entget pnt)))
(if(and(/=ple“LWPOLYLINE”)(/=ple“POLYLINE”))
(程序
(setq nop(+1 nop))
(setq alen(-alen 1))
(princ“\n非多段线过滤”)
);结束程序
(程序
(setq plc(cdr(assoc 70(entget pnt)))
(如果(=plc 0)
(程序
(setq ope(+1 ope))
(普林斯“\n警告!***多段线未闭合”)
);结束程序
);如果结束
(命令“area”“e”pnt)
(setq是(getvar“area”))
(setq aret(+aret))
);结束程序
);如果结束
(setq计数(+计数1))
);结束时
(if(=nop 0)(princ“\n所有选择的对象都是多段线”)(princ(strcat“\n”(itoa nop)“过滤了非多段线对象”))
(如果(=ope 0)(princ“所有多段线均已闭合”)(princ(strcat“n”(itoa ope)“多段线未闭合”))
(princ(strcat”\n层“lay”的总面积=“(rtos aret 2 0)”m2或“(rtos(/aret 10000)2 2)”Ha in“(itoa alen)”区域)
(普林斯)
);结束测量
(defun mlen()
(setq len(sslength ssl))
(setq alen(sslength ssl))
(setq pert 0)
(setq计数0)
(setq nop 0)
(while(/=长度计数)
(setq pnt(ssname ssl计数))
(setq ple(cdr(assoc 0(entget pnt)))
(if(and(/=ple“LWPOLYLINE”)(/=ple“POLYLINE”))
(程序
(setq nop(+1 nop))
(setq alen(-alen 1))
(princ“\n非多段线过滤”)
);结束程序
(程序
(命令“area”“e”pnt)
(setq per(getvar“周长”))
(setq pert(+每pert))
);结束程序
);如果结束
(setq计数(+计数1))
);结束时
(if(=nop 0)(princ“\n所有选择的对象都是多段线”)(princ(strcat“\n”(itoa nop)“过滤了非多段线对象”))
(princ(strcat“\n层“lay”的总长度=“(rtos pert 2 1)”m或“(rtos(/pert 0.3048)2 0)”英尺英寸“(itoa alen)”长度)
(普林斯)
);结束MLEN
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 22:25:00 | 显示全部楼层
下面是一个更新的例程,用于添加类似Lisp代码的功能。我希望这会有帮助。
 
应观察该网站及其所有成员的“帮助性”。很明显,我们都喜欢在力所能及的地方提供帮助。然而,这是一个基于教学的网站,因此最终目标是帮助他人学习AutoCAD的各个方面。
 
关于Lisp或VBA,帮助性和响应性太高可能会帮助一个人学习编程。
 
伴随此消息的例程可能不适合VBA教程(或者可能是),但它应该允许特定的编码问题。如果您需要对代码进行进一步修改,我将尽我所能回答这些问题。
 
  1.    Option Explicit
  2. Sub PutPLProps2XL()
  3. Dim strLayName As String
  4.   strLayName = GetObjectLayer()
  5.   If strLayName <> "" Then
  6.      If ClosedPLSS(strLayName) Then
  7.         Dim objSS As AcadSelectionSet
  8.         Dim entEntity As AcadEntity
  9.         Dim objExcel As Excel.Application
  10.         Dim objRange As Excel.Range
  11.         Dim entLWPoly As AcadLWPolyline
  12.         Dim ent2DPoly As AcadPolyline
  13.         Dim intCount As Integer
  14.            On Error GoTo errHandler
  15.            Set objExcel = GetObject(, "Excel.Application")
  16.            On Error GoTo 0
  17.            Set objRange = objExcel.ActiveWorkbook.ActiveSheet.Range("A1")
  18.            objRange.value = "Layer"
  19.            objRange.Offset(0, 1).value = "Pline Type"
  20.            objRange.Offset(0, 2).value = "Length"
  21.            objRange.Offset(0, 3).value = "Area"
  22.               Set objSS = ThisDrawing.SelectionSets.Item("TempSSet")
  23.               For intCount = 0 To objSS.count - 1
  24.                  Set entEntity = objSS.Item(intCount)
  25.                  If entEntity.ObjectName = "AcDbPolyline" Then
  26.                     Set entLWPoly = entEntity
  27.                     objRange.Offset(intCount + 1, 0).value = entLWPoly.Layer
  28.                     objRange.Offset(intCount + 1, 1).value = "LWPolyline"
  29.                     objRange.Offset(intCount + 1, 2).value = entLWPoly.Length
  30.                     objRange.Offset(intCount + 1, 3).value = entLWPoly.Area
  31.                  Else
  32.                     Set ent2DPoly = entEntity
  33.                     objRange.Offset(intCount + 1, 0).value = ent2DPoly.Layer
  34.                     objRange.Offset(intCount + 1, 1).value = "2DPolyline"
  35.                     objRange.Offset(intCount + 1, 2).value = ent2DPoly.Length
  36.                     objRange.Offset(intCount + 1, 3).value = ent2DPoly.Area
  37.                  End If
  38.               Next
  39.      Set objExcel = Nothing
  40.      End If
  41.   End If
  42.   Exit Sub
  43. errHandler:
  44.   Err.Clear
  45.   Set objExcel = CreateObject("Excel.Application")
  46.   With objExcel
  47.      .Workbooks.Add
  48.      .Visible = True
  49.      .WindowState = xlMinimized
  50.   End With
  51.   Resume Next
  52. End Sub
  53. Function ClosedPLSS(strLayName As String) As Boolean
  54.   Dim intCode(21) As Integer
  55.   Dim varData(21) As Variant
  56.   ClosedPLSS = False
  57.   intCode(0) = -4: varData(0) = "<Or"
  58.      intCode(1) = -4: varData(1) = "<And"
  59.         intCode(2) = 0: varData(2) = "POLYLINE" 'or closed PLINES's
  60.         intCode(3) = -4: varData(3) = "&="
  61.         intCode(4) = 70: varData(4) = 1
  62.         intCode(5) = -4: varData(5) = "&"
  63.         intCode(6) = 70: varData(6) = 135
  64.         intCode(7) = -4: varData(7) = "<Not"
  65.            intCode( = -4: varData( = "&="
  66.            intCode(9) = 70: varData(9) = 8
  67.         intCode(10) = -4: varData(10) = "Not>"
  68.         intCode(11) = 8: varData(11) = strLayName
  69.      intCode(12) = -4: varData(12) = "And>"
  70.      
  71.      intCode(13) = -4: varData(13) = "<And"
  72.         intCode(14) = 0: varData(14) = "LWPOLYLINE" 'or closed LWP's
  73.         intCode(15) = -4: varData(15) = "&="
  74.         intCode(16) = 70: varData(16) = 1
  75.         intCode(17) = -4: varData(17) = "&"
  76.         intCode(18) = 70: varData(18) = 129
  77.         intCode(19) = 8: varData(19) = strLayName
  78.      intCode(20) = -4: varData(20) = "And>"
  79.   intCode(21) = -4: varData(21) = "Or>"
  80.   
  81.   If FilteredSS(intCode, varData) > 0 Then ClosedPLSS = True
  82. End Function
  83. Private Sub SSPrep()
  84. Dim SSS As AcadSelectionSets
  85.   'choose a selection set name for temporary storage and
  86.   'ensure that it does not currently exist
  87.   On Error Resume Next
  88.   Set SSS = ThisDrawing.SelectionSets
  89.      If SSS.count > 0 Then
  90.         SSS.Item("TempSSet").Delete
  91.      End If
  92. End Sub
  93. Function FilteredSS(Optional grpCode As Variant, Optional dataVal As Variant) As Integer
  94.   Dim TempObjSS As AcadSelectionSet
  95.   SSPrep
  96.   Set TempObjSS = ThisDrawing.SelectionSets.Add("TempSSet")
  97.         'generate selection set
  98.      TempObjSS.Select acSelectionSetAll, , , grpCode, dataVal
  99.   FilteredSS = TempObjSS.count
  100. End Function
  101. Function GetObjectLayer() As String
  102. Dim ent As AcadEntity
  103. Dim varPickPT As Variant
  104.   On Error GoTo errHandler
  105.   ThisDrawing.Utility.GetEntity ent, varPickPT, "Select an entity on a layer with which to focus: "
  106.   GetObjectLayer = ent.Layer
  107.   Exit Function
  108. errHandler:
  109.   GetObjectLayer = ""
  110. End Function
回复

使用道具 举报

1

主题

8

帖子

7

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 22:28:48 | 显示全部楼层
谢谢你。。。
回复

使用道具 举报

gio

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 22:31:59 | 显示全部楼层
肖恩,
 
我试着用VB版本使用你的代码。6.3、Excell 2003,出现以下消息:
 
“未定义用户定义的类型”位于第Dim objExcel行的Excel。应用
 
正如你所见,我是用VB的begginer。我能做什么?
非常感谢。
回复

使用道具 举报

48

主题

1073

帖子

1043

银币

后起之秀

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

铜币
238
发表于 2022-7-6 22:35:31 | 显示全部楼层
这就是为什么我试着为人们指出正确的方向,而不是为他们编写代码。事实上,我很少真正完成我的代码。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 22:37:10 | 显示全部楼层
 
见本帖第6篇。这可能与您描述的问题有关。
 
你说你在用VB 6.3;您是指Autocad VBA 6.3还是VB6。如果是后者,您可能会在上述代码中遇到更多问题,因为所有Autocad对象都需要修改。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 22:41:06 | 显示全部楼层
 
我想你的意思是“公众消费的防弹密码”
 
我很想在定制中发布一个民意调查,以确定程序员在多大程度上使他们的代码不易破坏。我写过的任何东西的大多数用户都可以直接访问我,所以我往往很松懈。最近,我加强了错误处理,但这个过程可以将开发时间加倍,以获得真正牢不可破的代码。
回复

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 22:42:46 | 显示全部楼层
我有个问题
当我尝试使用它时,我得到一个错误“编译错误:变量未定义”
这部分代码用黄色突出显示
函数FilteredSS(可选grpCode为Variant,可选dataVal为Variant)为Integer
 
我已经照你在帖子里说的做了
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 22:45:16 | 显示全部楼层
我已经有很长时间没有启动ol'VBAIDE了。我复制并粘贴了代码,并设置了适当的引用(Microsoft Excel 16.0对象库),代码似乎运行良好。
 
是否有可能在转移例程时,部分代码没有被复制?
回复

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 22:49:39 | 显示全部楼层
不,我查了两次
我使用autocad 2017和excel 2010。也许有问题。
这个帖子是从2007年开始的。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 14:02 , Processed in 0.331689 second(s), 70 queries .

© 2020-2025 乐筑天下

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