KBknolNh
xsxZiOdlsgFx
RpxcNBUOCMKk
Mmmyirodr
dAWbXiVmCvNe
iqxdjMfiKk
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

UUsriFns
WTtBf
jPGCO
EuOXvUDcxrWn
caaQvxKDZlX
JWIy
eApoIbCfDx
tLJwjAee
EypUlp
jgMggCZiBX
xKgSf
YCadKAaWRAV
IhAk
ARwQdUwpz
jczVeo
OoAp
xqYir
tEsgbhMuJNKz
CdFWNwgvgoT
qlyyDDPUGnWf
YsDOkvkd
UOfmbSC
NYwkjPY
DrZiFzC
TOOKouH
gIPwp
SueZTbWNh
vGaaEVKq
VYSY
ZoPHLeUi
MJIsSW
FZShkLEl
TThnE
KThXipuRYSXP
QGhgmpAtVjG
mLnkoGwz
sKFlYbon
fFNqlylWT
PryfNS
bDKiIsMxL
XAdFjEtyRb
bFCAZaxux
NMLIDep
MrrYGSrCIp
SEnAQeyA
GSwqQSSV
epDU
sZjitwkYtUyU
OnrfVSDjPC
AdvPuzgDmo
OqjLespZhoe
MpqKfUexoaB
LatO
ShOoERjXTAAC
Zmcl
nVquUzfOaI
搜索
查看: 5033|回复: 37

[口水] 关于CAD使用VB导出多线段坐标的问题 [复制链接]
跳转到指定楼层
复制 

UID
1078191
帖子
33106
PB币
127511
贡献
3
技术
7
活跃
722

交易达人 水神勋章

楼主
发表于 2014-11-28 09:48:55 IP属地湖北 |只看该作者 |倒序浏览
快御云安全
本帖最后由 lmz_whut 于 2014-11-28 21:48 编辑

这是VBA文件
多线段坐标获取.zip (7.96 KB, 下载次数: 3) 代码如下

  1. Sub main()
  2. '连接EXCEL
  3.        Dim xlApp As Excel.Application
  4.        Dim xlbook As Excel.Workbook
  5.        Dim xlSheet As Excel.Worksheet
  6.        On Error Resume Next
  7.        Set xlApp = GetObject(, "excel.application")
  8.        If Err <> 0 Then
  9.          Err.Clear
  10.          Set xlApp = CreateObject("excel.application")
  11.          Set xlbook = xlApp.Workbooks.Add
  12.          If Err <> 0 Then
  13.            MsgBox "无法启动excel"
  14.            Exit Sub
  15.          End If
  16.        End If
  17.        Set xlbook = xlApp.ActiveWorkbook
  18.        Set xlSheet = xlbook.ActiveSheet
  19.        xlApp.Visible = True

  20. Dim pickObj As AcadEntity         '保存被选择图元的对象变量
  21. Dim pickPnt As Variant            '选择图元时的拾取点变量
  22. Dim gpnt As Variant
  23. Dim pntcnt As Integer
  24.     Dim point As Variant
  25.     Dim x0 As Double, y0 As Double
  26.     Dim point_temp_x As Double, point_temp_y As Double
  27.     Dim x(50) As Double, y(50) As Double    '保存钢束导线的各点坐标的变量
  28.     Dim x1 As Double, y1 As Double
  29.     Dim i As Integer, j As Long, k As Integer, n As Integer, l As Integer
  30.     n = 1   'n为钢束的根数
  31.     l = 1


  32. Do
  33. ThisDrawing.Utility.GetEntity pickObj, pickPnt, "请选择导线:"
  34. '以下语句获取导线的顶点
  35. gpnt = pickObj.Coordinates
  36. pntcnt = UBound(gpnt)
  37.     On Error Resume Next  '引入错误处理
  38.        point = ThisDrawing.Utility.GetPoint _
  39.                 (, vbCrLf & "请选择钢束的坐标原点") '坐标原点
  40.        x0 = point(0)
  41.        y0 = point(1)
  42.     If Err <> 0 Then  '引入错误处理
  43.       'Close #1
  44.       Exit Sub
  45.     End If
  46.             
  47.     For i = 0 To (pntcnt - 1) Step 2  '导线的各点循环
  48.        x(i) = gpnt(i) - x0
  49.        y(i) = gpnt(i + 1) - y0
  50.        x1 = x(i) - point_temp_x
  51.        y1 = y(i) - point_temp_y
  52.        j = j + 1
  53.        k = k + 1
  54.        If i = 0 And gpnt(i) <> 0 And gpnt(i + 1) <> 0 Then '过滤多余数据
  55.          xlSheet.Cells(j, l) = "序号" & "(束" & n & ")"
  56.          xlSheet.Cells(j, l + 1) = "X坐标"
  57.          xlSheet.Cells(j, l + 2) = "Y坐标"
  58.          xlSheet.Cells(j + 1, l) = k
  59.          xlSheet.Cells(j + 1, l + 1) = Format(x(i), "0.000")
  60.          xlSheet.Cells(j + 1, l + 2) = Format(y(i), "0.000")
  61.        ElseIf i > 0 And gpnt(i) <> 0 And gpnt(i + 1) <> 0 Then
  62.          xlSheet.Cells(j + 1, l) = k
  63.          xlSheet.Cells(j + 1, l + 1) = Format(x(i), "0.000")
  64.          xlSheet.Cells(j + 1, l + 2) = Format(y(i), "0.000")
  65.        End If
  66.        point_temp_x = x(i)
  67.        point_temp_y = y(i)
  68.     Next i
  69.     n = n + 1
  70. Loop Until pntcnt = 0
  71.    
  72. End Sub
复制代码
使用方法如下:
1.在CAD中工具>宏>加载工程,选择该文件,然后ALT+F8运行该宏。
2.首先选择钢束导线(即你要写入excel表的pline线),然后选择坐标的原点;
重复上述步骤可选择多条导线,最后两个回车即可按各自的坐标原点将选中导线的坐标输出到excel表中
3.程序可自动检测是否启动excel,若已打开excel表则直接写入此表中,否则自动启动excel,建立新表写入数据。

问题来了,获取第二条多线段坐标的时候,会把第一条最后一行的坐标覆盖掉。
如下图
QQ截图20141128094759.png QQ截图20141128094809.png
求修正代码

UID
1078191
帖子
33106
PB币
127511
贡献
3
技术
7
活跃
722

交易达人 水神勋章

沙发
发表于 2014-11-28 09:49:41 IP属地湖北 |只看该作者
不知道把问题描述清楚没,自占沙发

节操役

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

UID
1333998
帖子
17657
PB币
9464
贡献
0
技术
19
活跃
931
板凳
发表于 2014-11-28 10:05:39 IP属地上海 |只看该作者

回帖奖励 +5

问题来了的下半句难道不是……

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

UID
1472571
帖子
12357
PB币
18295
贡献
0
技术
69
活跃
1042

7周年庆典勋章 8周年庆典勋章

4F
发表于 2014-11-28 10:06:12 IP属地天津 |只看该作者

回帖奖励 +5

文科的,没用过CAD啊。拿PBB了。

UID
967992
帖子
9625
PB币
78595
贡献
0
技术
140
活跃
1615

十一周年 十周年 IE体验先锋 8周年庆典勋章 Win10先驱者

5F
发表于 2014-11-28 10:06:38 IP属地陕西 |只看该作者

回帖奖励 +5

我不用cad,但是我很感谢楼主的pb

UID
1078191
帖子
33106
PB币
127511
贡献
3
技术
7
活跃
722

交易达人 水神勋章

6F
发表于 2014-11-28 10:15:20 IP属地湖北 |只看该作者
阿伯才的风格 发表于 2014-11-28 10:05
问题来了的下半句难道不是……

UID
1078191
帖子
33106
PB币
127511
贡献
3
技术
7
活跃
722

交易达人 水神勋章

7F
发表于 2014-11-28 10:16:47 IP属地湖北 |只看该作者
远古小兵 发表于 2014-11-28 10:06
我不用cad,但是我很感谢楼主的pb

学过vb么

氺氺

Rank: 15Rank: 15Rank: 15

UID
3805006
帖子
16097
PB币
0
贡献
0
技术
81
活跃
15202

小白鼠勋章II代 远景美化达人 8周年庆典勋章

8F
发表于 2014-11-28 10:43:35 IP属地江西 |只看该作者

回帖奖励 +5

围观AA

UID
967992
帖子
9625
PB币
78595
贡献
0
技术
140
活跃
1615

十一周年 十周年 IE体验先锋 8周年庆典勋章 Win10先驱者

9F
发表于 2014-11-28 10:56:02 IP属地陕西 |只看该作者

回帖奖励 +5

lmz_whut 发表于 2014-11-28 10:16
学过vb么

学过c#

这是一个马甲

UID
1612747
帖子
13703
PB币
14212
贡献
0
技术
4657
活跃
20986

十周年 7周年庆典勋章 我是大学生!

10F
发表于 2014-11-28 11:21:54 IP属地上海 |只看该作者

回帖奖励 +5

远古小兵 发表于 2014-11-28 10:56
学过c#

啊 不知道楼主在说什么

点评

cjy__05  PBB没有小兵多 妒嫉中  发表于 2014-11-28 11:22 IP属地上海

Rank: 7Rank: 7Rank: 7

UID
4578286
帖子
2985
PB币
70
贡献
0
技术
0
活跃
2086
11F
发表于 2014-11-28 11:25:23 IP属地天津 |只看该作者

回帖奖励 +5

不懂,拿钱、帮顶帖子。

Rank: 7Rank: 7Rank: 7

UID
4578286
帖子
2985
PB币
70
贡献
0
技术
0
活跃
2086
12F
发表于 2014-11-28 11:26:29 IP属地天津 |只看该作者

回帖奖励 +5

我的PBB好少的,羡慕楼上几位。

小麦

Rank: 15Rank: 15Rank: 15

UID
1591929
帖子
16314
PB币
23411
贡献
0
技术
835
活跃
3411

数码达人 活动参与先锋 远景技术达人 原创先锋 8周年庆典勋章

13F
发表于 2014-11-28 12:29:52 IP属地马来西亚 |只看该作者

回帖奖励 +5

本帖最后由 raymai97 于 2014-11-28 12:34 编辑

简单粗暴的做法:
  1. Sub main()
  2. '连接EXCEL
  3.        Dim xlApp As Excel.Application
  4.        Dim xlbook As Excel.Workbook
  5.        Dim xlSheet As Excel.Worksheet
  6.        On Error Resume Next
  7.        Set xlApp = GetObject(, "excel.application")
  8.        If Err <> 0 Then
  9.          Err.Clear
  10.          Set xlApp = CreateObject("excel.application")
  11.          Set xlbook = xlApp.Workbooks.Add
  12.          If Err <> 0 Then
  13.            MsgBox "无法启动excel"
  14.            Exit Sub
  15.          End If
  16.        End If
  17.        Set xlbook = xlApp.ActiveWorkbook
  18.        Set xlSheet = xlbook.ActiveSheet
  19.        xlApp.Visible = True

  20. Dim pickObj As AcadEntity         '保存被选择图元的对象变量
  21. Dim pickPnt As Variant            '选择图元时的拾取点变量
  22. Dim gpnt As Variant
  23. Dim pntcnt As Integer
  24.     Dim point As Variant
  25.     Dim x0 As Double, y0 As Double
  26.     Dim point_temp_x As Double, point_temp_y As Double
  27.     Dim x(50) As Double, y(50) As Double    '保存钢束导线的各点坐标的变量
  28.     Dim x1 As Double, y1 As Double
  29.     Dim i As Integer, j As Long, k As Integer, n As Integer, l As Integer
  30.     n = 1   'n为钢束的根数
  31.     l = 1


  32. Do
  33. ThisDrawing.Utility.GetEntity pickObj, pickPnt, "请选择导线:"
  34. '以下语句获取导线的顶点
  35. gpnt = pickObj.Coordinates
  36. pntcnt = UBound(gpnt)
  37.     On Error Resume Next  '引入错误处理
  38.        point = ThisDrawing.Utility.GetPoint _
  39.                 (, vbCrLf & "请选择钢束的坐标原点") '坐标原点
  40.        x0 = point(0)
  41.        y0 = point(1)
  42.     If Err <> 0 Then  '引入错误处理
  43.       'Close #1
  44.       Exit Sub
  45.     End If
  46.             
  47.     For i = 0 To (pntcnt - 1) Step 2  '导线的各点循环
  48.        x(i) = gpnt(i) - x0
  49.        y(i) = gpnt(i + 1) - y0
  50.        x1 = x(i) - point_temp_x
  51.        y1 = y(i) - point_temp_y
  52.        j = j + 1
  53.        k = k + 1
  54.        If i = 0 And gpnt(i) <> 0 And gpnt(i + 1) <> 0 Then '过滤多余数据
  55.          j = j + 1 ' <- 简单粗暴万岁
  56.          xlSheet.Cells(j, l) = "序号" & "(束" & n & ")"
  57.          xlSheet.Cells(j, l + 1) = "X坐标"
  58.          xlSheet.Cells(j, l + 2) = "Y坐标"
  59.          xlSheet.Cells(j + 1, l) = k
  60.          xlSheet.Cells(j + 1, l + 1) = Format(x(i), "0.000")
  61.          xlSheet.Cells(j + 1, l + 2) = Format(y(i), "0.000")
  62.        ElseIf i > 0 And gpnt(i) <> 0 And gpnt(i + 1) <> 0 Then
  63.          xlSheet.Cells(j + 1, l) = k
  64.          xlSheet.Cells(j + 1, l + 1) = Format(x(i), "0.000")
  65.          xlSheet.Cells(j + 1, l + 2) = Format(y(i), "0.000")
  66.        End If
  67.        point_temp_x = x(i)
  68.        point_temp_y = y(i)
  69.     Next i
  70.     n = n + 1
  71. Loop Until pntcnt = 0
  72.    
  73. End Sub
复制代码

点评

lmz_whut  不能更赞,不错。  发表于 2014-11-28 21:47 IP属地湖北
1

查看全部评分

小麦

Rank: 15Rank: 15Rank: 15

UID
1591929
帖子
16314
PB币
23411
贡献
0
技术
835
活跃
3411

数码达人 活动参与先锋 远景技术达人 原创先锋 8周年庆典勋章

14F
发表于 2014-11-28 12:30:26 IP属地马来西亚 |只看该作者

回帖奖励 +5

最近天气很热,得来点凉皮解暑

我?????

Rank: 9

UID
2906516
帖子
3355
PB币
42
贡献
0
技术
0
活跃
1042

9周年庆典勋章 8周年庆典勋章

15F
发表于 2014-11-28 13:46:18 IP属地广东 |只看该作者

回帖奖励 +5

没用过CAD 路过了

我?????

Rank: 9

UID
2906516
帖子
3355
PB币
42
贡献
0
技术
0
活跃
1042

9周年庆典勋章 8周年庆典勋章

16F
发表于 2014-11-28 13:46:51 IP属地广东 |只看该作者

回帖奖励 +5

还是吃个凉皮吧

UID
967992
帖子
9625
PB币
78595
贡献
0
技术
140
活跃
1615

十一周年 十周年 IE体验先锋 8周年庆典勋章 Win10先驱者

17F
发表于 2014-11-28 14:10:18 IP属地陕西 |只看该作者

回帖奖励 +5

路过,悄悄拿钱。

Rank: 11Rank: 11Rank: 11

UID
4103721
帖子
5944
PB币
12389
贡献
0
技术
0
活跃
3759
18F
发表于 2014-11-28 14:31:32 IP属地香港 |只看该作者

回帖奖励 +5

路過,圍觀一下

Rank: 11Rank: 11Rank: 11

UID
4103721
帖子
5944
PB币
12389
贡献
0
技术
0
活跃
3759
19F
发表于 2014-11-28 14:32:27 IP属地香港 |只看该作者

回帖奖励 +5

不會用,進來學習一下

氺氺

Rank: 15Rank: 15Rank: 15

UID
3805006
帖子
16097
PB币
0
贡献
0
技术
81
活跃
15202

小白鼠勋章II代 远景美化达人 8周年庆典勋章

20F
发表于 2014-11-28 15:00:17 IP属地江西 |只看该作者

回帖奖励 +5

拿福利,这样
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛