找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 541|回复: 4

[VBA程序]:Spline To Polyline 函数

[复制链接]
发表于 2005-11-24 10:58:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
看了论坛里关于spline线转换为pline线方法的讨论,感觉都不尽人意就自己写了一个。自我感觉还可以特与大家分享:


  1. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  2. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  3. ''                                                         ''
  4. ''       Spline To Polyline 函数      ver 1.2              ''
  5. ''                                                         ''
  6. ''         调用函数:spl2pl()                              ''
  7. ''                                                         ''
  8. ''         作者:Macula       2005-11-23                   ''
  9. ''                                                         ''
  10. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  11. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


  12. Sub Spl2pl()
  13.   Dim sss As AcadSpline
  14.   Dim o As AcadObject
  15.   Dim ov As Variant

  16.   ThisDrawing.SetVariable "REGENMODE", 1

  17.   On Error Resume Next
  18.   
  19.   ThisDrawing.Utility.GetEntity o, ov, vbCrLf & "选择要转换的SPLINE:"
  20.   
  21.   If Err.Number <> 0 Then
  22.     ThisDrawing.Utility.Prompt "没有选择任何对象,退出!" & vbCrLf
  23.     Err.Clear
  24.     Exit Sub
  25.   End If
  26.   
  27.   If o.ObjectName <> "AcDbSpline" Then
  28.     ThisDrawing.Utility.Prompt "选择对象不是SPLINE,退出!" & vbCrLf
  29.     Exit Sub
  30.   Else
  31.     Set sss = o
  32.     Set o = Nothing
  33.   End If
  34.   
  35.   Dim i As Long, j As Long
  36.   Dim ns() As Double, n As Long
  37.   Dim t As Variant
  38.   
  39.   '''''''''''''''''''''''''''''''''''''''''''''
  40.   '          得到SPLINE拟点
  41.   '''''''''''''''''''''''''''''''''''''''''''''
  42.   n = sss.NumberOfFitPoints
  43.   ReDim Preserve ns(n * 3 - 1)
  44.   j = 0
  45.   For i = 0 To n - 1
  46.     t = sss.GetFitPoint(i)
  47.     j = j + 1
  48.     ns(j * 3 - 3) = t(0)
  49.     ns(j * 3 - 2) = t(1)
  50.     ns(j * 3 - 1) = t(2)
  51.   Next

  52.   Dim doc1 As AcadDocument, doc2 As AcadDocument
  53.   Set doc1 = ThisDrawing.Application.ActiveDocument
  54.   
  55.   
  56.   ''''''''''''''''''''''''''''''''''''''''''''''
  57.   '        生成dxf文件
  58.   ''''''''''''''''''''''''''''''''''''''''''''''
  59.   Set doc2 = ThisDrawing.Application.Documents.Add("abc.dwg")
  60.   doc2.ModelSpace.AddSpline ns, sss.StartTangent, sss.EndTangent
  61.   doc2.SaveAs "tmp.dxf", acR12_dxf
  62.   
  63.   Dim tmpFileName As String
  64.   
  65.   tmpFileName = doc2.FullName
  66.   doc2.Close
  67.   Set doc2 = ThisDrawing.Application.Documents.Open(tmpFileName)
  68.   
  69.   Dim pl As Acad3DPolyline
  70.   
  71.   
  72.   '''''''''''''''''''''''''''''''''''''''''''''
  73.   '    由DXF文件生成PL线
  74.   '''''''''''''''''''''''''''''''''''''''''''''
  75.   Set pl = doc2.ModelSpace.Item(0)
  76.   Err.Clear
  77.   Dim od As Variant, nns() As Double
  78.   j = -1
  79.   Do While Err.Number = 0
  80.     j = j + 1
  81.     od = pl.Coordinate(j)
  82.   Loop
  83.   Err.Clear
  84.   ReDim Preserve nns(j * 3 - 1)
  85.   
  86.   For i = 0 To j - 1
  87.     od = pl.Coordinate(i)
  88.     nns((i + 1) * 3 - 3) = od(0)
  89.     nns((i + 1) * 3 - 2) = od(1)
  90.     nns((i + 1) * 3 - 1) = od(2)
  91.   Next

  92.   doc1.Activate
  93.   
  94.   Dim pll As AcadPolyline
  95.   Set pll = doc1.ModelSpace.AddPolyline(nns)
  96.   pll.Layer = sss.Layer
  97.   pll.Color = sss.Color
  98.   sss.Delete
  99.   Set sss = Nothing
  100.   
  101.   doc2.Close
  102.   Set doc2 = Nothing
  103.   Set doc1 = Nothing
  104.   
  105.   '''''''''''''''''''''''''''''''''''''''''''
  106.   '      删除临时dxf文件
  107.   '''''''''''''''''''''''''''''''''''''''''''
  108.   tmpFileName = Replace(tmpFileName, "", "\")
  109.   DelFile (tmpFileName)
  110. End Sub



  111. ''''''''''''''''''''''''''''''''''''''''''''''
  112. '
  113. '使用Script Fso对象模型删除文件
  114. '
  115. ''''''''''''''''''''''''''''''''''''''''''''''
  116. Sub DelFile(ByVal fileName As String)
  117.     Dim fso As New Scripting.FileSystemObject
  118.     On Error Resume Next
  119.     fso.DeleteFile fileName
  120.     Set fso = Nothing
  121. End Sub

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-11-24 20:08:45 | 显示全部楼层
程序不错,不过为什么转换成多段线后和未转换前不完全重合?见图,红色为样条曲线,白色为多段线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-25 17:01:09 | 显示全部楼层
这个问题是矢量图型的问题,矢量图型中的坐标只有近似值没有标准值!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-25 18:00:12 | 显示全部楼层
获益匪浅,希望看到楼主更多的好程序,:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-8 10:51:29 | 显示全部楼层
利用R12 DXF文件不能存样条曲线吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-24 07:02 , Processed in 0.404518 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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