ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 905738810

[原创] Excel to CAD 绘图技术

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2020-7-13 10:38 | 显示全部楼层
正在学,太谢谢啦。Excel----CAD,有两种方案,一种是EXCEL TO CAD 就是楼主写的,另一种是在 CAD里调用 Excel, 明经论坛绝大部分用这种方案。各有各的长处,偏工科的会习惯从CAD调用,这样处理绘图更适用。个人认为,调用Excel数据绘制相对简单的图形,还是第一种方法方便,恰恰这种方法网上介绍的比较少。
期待楼主更多的介绍

TA的精华主题

TA的得分主题

发表于 2020-7-13 10:48 | 显示全部楼层
905738810 发表于 2020-7-12 22:22
前面说画直线,画圆只有这一种方法,是不是感觉很单一。其实这一种方法就可以演变成多种绘图方法,我给大家 ...

谢谢分享,慢慢学习!

TA的精华主题

TA的得分主题

发表于 2020-7-13 10:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
damn to invest,learning

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-13 11:17 来自手机 | 显示全部楼层
一缕江风 发表于 2020-7-13 10:38
正在学,太谢谢啦。Excel----CAD,有两种方案,一种是EXCEL TO CAD 就是楼主写的,另一种是在 CAD里调用 Ex ...

两者基本没差别,会一种就会第二种了

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-7-13 11:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一缕江风 发表于 2020-7-13 10:38
正在学,太谢谢啦。Excel----CAD,有两种方案,一种是EXCEL TO CAD 就是楼主写的,另一种是在 CAD里调用 Ex ...

可以参考这个帖子:
分享学习AutoCAD编程之VBA笔记 (期初完结!)
http://www.3dportal.cn/discuz/fo ... amp;fromuid=1739914
(出处: 三维网)

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-7-13 12:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
kuangben8 发表于 2020-7-13 11:35
可以参考这个帖子:
分享学习AutoCAD编程之VBA笔记 (期初完结!)
http://www.3dportal.cn/discuz/forum ...

谢谢啦

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-13 12:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
三,在图形中画圆弧 image.png
  1. Public Sub 圆弧()
  2.     Dim doct As Object
  3.     Set doct = doc '引用之前函数,自己去找
  4.     If doct Is Nothing Then Exit Sub
  5.    
  6.     Pi = Atn(1) * 4 'π的算法
  7.     Dim pt(2) As Double '圆心坐标点
  8.     Dim Rad  As Double
  9.     Dim stAng As Double
  10.     Dim enAng As Double
  11.    
  12.     pt(0) = 100: pt(1) = 100: pt(2) = 0
  13.     Rad = 100 '圆弧的半径
  14.     stAng = 0 '圆弧的起始角度
  15.     enAng = Pi / 2 '圆弧的终止角度
  16.     Set Arc = doct.ModelSpace.AddArc(pt, Rad, stAng, enAng)
  17. End Sub
复制代码
代码画了四分之一的圆弧。
前三行和以前一样不解释
第四行Pi = Atn(1) * 4,因为我们知道正切45度是1,那么反正切1就是45度了,再*4就是180度,这个Atn函数返回的不是度数是弧度制
,所以就可以计算出派的值3.14。不需要精准的话也可以直接pi=3.14


赋值跳过直接解释最后一行Set Arc = doct.ModelSpace.AddArc(pt, Rad, stAng, enAng)
AddArc:绘制圆弧方法  (参数1:圆心坐标:“双精度一维3元素数组“,参数2:半径,参数3:起始角度(弧度制)参数4:终止角度(弧度制)
                  返回值AcadArc对象,可以对AcadArc对象进行图层,颜色,线性,线宽,等等修改或读取。
                  CADVBA中画圆弧方法只有这一种。
AddArc方法的前两个参数和画圆是一样的,重点说后两个。
在CAD中角度大小是从X方向角度为0,逆时针旋转增大的
image.png

参数3:起始角度:是圆弧起始点与原心连线的角度(注意:是弧度制)
参数4:终止角度:是圆弧末端点与原心连线的角度(注意:是弧度制)
起始角度大于终止角度时,图形是一个大于半圆的圆弧(优弧)
起始角度小于终止角度,图形是一个小于半圆的圆弧(劣弧)
image.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-13 13:31 | 显示全部楼层
首先怕新人不知道弧度与角度转换关系,写了两个函数。
  1. Function JtoH(ByVal j As Double) As Double '角度转弧度
  2. Pi = Atn(1) * 4
  3. JtoH = j / 180 * Pi
  4. End Function
  5. Function HtoJ(ByVal h As Double) As Double '弧度转角度
  6. Pi = Atn(1) * 4
  7. HtoJ = h / Pi * 180
  8. End Function
复制代码
上回圆弧方法我又说了CADVBA中画圆弧方法只有这一种,同样的咱们还是可以变通,分享几个画圆弧自定义函数。
  1. '通过圆心,起点和端点创建圆弧
  2. Public Function AddArcCSN(ByVal ptCen As Variant, ByVal ptSt As Variant, ByVal ptNode As Variant) As AcadArc
  3.     Dim radius As Double
  4.     Dim stAng As Double
  5.     Dim enAng As Double
  6.    
  7.     radius = Sqr((ptSt(0) - ptCen(0)) ^ 2 + (ptSt(1) - ptCen(1)) ^ 2)
  8.     stAng = doct.Utility.AngleFromXAxis(ptCen, ptSt) '取得起始角度
  9.     enAng = doct.Utility.AngleFromXAxis(ptCen, ptNode) '取得终止角度
  10.     Set AddArcCSN = doct.ModelSpace.AddArc(ptCen, radius, stAng, enAng)
  11. End Function
复制代码
  1. '通过圆心,起点和圆弧的角度创建圆弧
  2. Public Function AddArcCSA(ByVal ptCen As Variant, ByVal ptSt As Variant, ByVal angle As Double) As AcadArc
  3.     Dim radius As Double
  4.     Dim stAng As Double
  5.     Dim enAng As Double
  6.    
  7.     radius = Sqr((ptSt(0) - ptCen(0)) ^ 2 + (ptSt(1) - ptCen(1)) ^ 2)
  8.     stAng = doct.Utility.AngleFromXAxis(ptCen, ptSt)
  9.     enAng = stAng + angle
  10.     Set AddArcCSA = doct.ModelSpace.AddArc(ptCen, radius, stAng, enAng)
  11. End Function
复制代码
  1. '通过圆心,起点和弦长创建圆
  2. Public Function AddArcCSC(ByVal ptCen As Variant, ByVal ptSt As Variant, ByVal chordLength As Double) As AcadArc
  3.     Dim radius As Double
  4.     Dim stAng As Double
  5.     Dim enAng As Double
  6.     radius = Sqr((ptSt(0) - ptCen(0)) ^ 2 + (ptSt(1) - ptCen(1)) ^ 2)
  7.     stAng = doct.Utility.AngleFromXAxis(ptCen, ptSt)
  8.     enAng = stAng + Atn(((chordLength / 2) / radius) / Sqr(1 - ((chordLength / 2) / radius) ^ 2)) * 2
  9.     Set AddArcCSC = doct.ModelSpace.AddArc(ptCen, radius, stAng, enAng)
  10. End Function
复制代码
  1. '通过圆心,起点和弧长来创建圆
  2. Public Function AddArcCSAL(ByVal ptCen As Variant, ByVal ptSt As Variant, ByVal arcLength As Double) As AcadArc
  3.     Dim radius As Double
  4.     Dim stAng As Double
  5.     Dim enAng As Double
  6.     radius = Sqr((ptSt(0) - ptCen(0)) ^ 2 + (ptSt(1) - ptCen(1)) ^ 2)
  7.     stAng = doct.Utility.AngleFromXAxis(ptCen, ptSt)
  8.     enAng = stAng + arcLength / radius
  9.     Set AddArcCSAL = doct.ModelSpace.AddArc(ptCen, radius, stAng, enAng)
  10. End Function
复制代码
  1. '通过三点来创建圆弧
  2. Public Function AddArc3P(ByVal pt1 As Variant, ByVal pt2 As Variant, ByVal pt3 As Variant) As AcadArc
  3.     Dim ptCen As Variant
  4.     Dim radius As Double
  5.     Dim stAng As Double
  6.     Dim enAng As Double
  7.     Dim pt12(2) As Double
  8.     Dim pt23(2) As Double
  9.     pt12(0) = (pt1(0) + pt2(0)) / 2
  10.     pt12(1) = (pt1(1) + pt2(1)) / 2
  11.     pt12(2) = (pt1(2) + pt2(2)) / 2
  12.     pt23(0) = (pt2(0) + pt3(0)) / 2
  13.     pt23(1) = (pt2(1) + pt3(1)) / 2
  14.     pt23(2) = (pt2(2) + pt3(2)) / 2
  15.     Dim angle1 As Double
  16.     Dim angle2 As Double
  17.     angle1 = doct.Utility.AngleFromXAxis(pt1, pt2) + 1.570793
  18.     angle2 = doct.Utility.AngleFromXAxis(pt2, pt3) + 1.570793
  19.     Dim line12z As AcadLine
  20.     Dim line23z As AcadLine
  21.     Set line12z = AddLineReAL(pt12, angle1, 100) '前面自定义函数
  22.     Set line23z = AddLineReAL(pt23, angle2, 100) '前面自定义函数
  23.     ptCen = line12z.IntersectWith(line23z, acExtendBoth)
  24.     line12z.Delete: line23z.Delete
  25.     radius = Sqr((pt1(0) - ptCen(0)) ^ 2 + (pt1(1) - ptCen(1)) ^ 2)
  26.     stAng = doct.Utility.AngleFromXAxis(ptCen, pt1)
  27.     enAng = doct.Utility.AngleFromXAxis(ptCen, pt3)
  28.     Set AddArc3P = doct.ModelSpace.AddArc(ptCen, radius, stAng, enAng)
  29. End Function
复制代码
  1. Dim doct As Object
  2. Sub 调用函数画圆弧例子()
  3.     Set doct = doc '引用之前函数,自己去找
  4.     If doct Is Nothing Then Exit Sub
  5.     Dim pt1(2) As Double
  6.     Pi = Atn(1) * 4
  7.     pt1(0) = 0: pt1(1) = 0: pt1(2) = 0
  8.     Dim pt2(2) As Double
  9.     pt2(0) = 100: pt2(1) = 100: pt2(2) = 0
  10.     Dim pt3(2) As Double
  11.     pt3(0) = -100: pt3(1) = -100: pt3(2) = 0
  12.     AddArcCSN pt1, pt2, pt3 '通过圆心,起点和端点创建圆弧
  13.     AddArcCSA pt1, pt2, Pi / 2 '通过圆心,起点和圆弧的角度创建圆弧
  14.     AddArcCSC pt1, pt2, 200 '通过圆心,起点和弦长创建圆
  15.     AddArcCSAL pt1, pt2, 500 '通过圆心,起点和弧长来创建圆
  16.     pt1(0) = 100: pt1(1) = 200: pt1(2) = 0
  17.     AddArc3P pt1, pt2, pt3 '通过三点来创建圆弧(三点不能在一条直线)
  18. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-13 13:51 | 显示全部楼层
中间插个小功能,说一个激活CAD窗口问题。
我们现在可以画出图形,可是发现画出图形后CAD窗口还是在后台安稳的待着,需要我们手动切换到CAD去查看图形。
有没有什么方法,让图形画完就切换到CAD呢?
我们用API就可以解决了。
  1. Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  2. (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  3. Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

  4. Sub 示例()
  5. Set acadApp = GetObject(, "AutoCAD.Application")
  6. Call jihuocad(acadApp)
  7. End Sub

  8. Sub jihuocad(acadApp)
  9. Dim hw&, cnt&
  10. Dim rttitle As String * 256
  11. hw& = FindWindow(vbNullString, acadApp.Caption)
  12. If hw& <> 0 Then
  13.     acadApp.WindowState = acMax
  14.     cnt& = SetForegroundWindow(hw&)
  15. End If
  16. End Sub
复制代码
在画完图形后我们调用 jihuocad 过程参数就是CAD程序对象,会神奇的发现CAD窗口置顶了,可视性大大增加。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-7-14 09:10 | 显示全部楼层
这不是CAD VBA本身的应用吗  我还以为EXCEL绘制图元呢  楼主这是在水贴
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-28 11:02 , Processed in 0.046978 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表