乐筑天下

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

曲线有问题。cls公司

[复制链接]

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2007-12-27 14:08:54 | 显示全部楼层 |阅读模式
本人'm使用Frank Oquendo#039;s曲线。cls将块沿多段线等距放置
故障I'm正在检索多段线的斜率(一阶导数)
&nbsp&nbsp dblParameter=objCurve。GetParameterAtDistance(i*dblSpacing)&nbsp&nbsp dblRotation=objCurve。GetFirst导数(dblParameter)&#039&lt-当我运行代码时,这里崩溃了,曲线的GetFirst导数方法。cls返回空。我认为错误发生在.EvalLispExpression行或它后面的那一行
有人给我出主意了吗

回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-12-27 19:16:46 | 显示全部楼层
GetFirst导数返回方向向量作为;变量数组,而不是双角度……因此,如果您的dblRotation是Dim#039;作为替补,它将失败。如果这不是'对于这个问题,你能定义你的;碰撞“;更详细一点?
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-12-28 09:19:14 | 显示全部楼层
当曲线类为'不需要
通过一点误差控制,这应该可以让你达到目的
  1. Option Explicit
  2. Const pi As Double = 3.14159265358979
  3. Sub DividePoly()
  4.    
  5.     Dim Ent As AcadEntity
  6.     Dim oPline As AcadLWPolyline
  7.     Dim cnt As Integer, CCnt As Integer
  8.     Dim Dist As Double, Tan As Double
  9.     Dim dLength As Double
  10.     Dim div As Integer
  11.     Dim unitL As Double
  12.     Dim i As Integer, j As Integer, K As Integer
  13.     Dim C1, C2, p
  14.     Dim C(5) As Variant
  15.     Dim dBulge As Double, Ang As Double
  16.     Dim Total As Double
  17.     Dim CoordCol As New Collection
  18.     Dim Elev As Double
  19.     Dim bBlock As Boolean
  20.     Dim oBref As AcadBlockReference
  21.     Dim sBlock As String
  22.     Dim Util As AcadUtility
  23.    
  24.     Set Util = ThisDrawing.Utility
  25.     'Set Ent = EntSel("Select a pline to divide:")
  26.     Util.GetEntity Ent, p, "Select a pline to divide:"
  27.     If TypeOf Ent Is AcadLWPolyline Then
  28.         Set oPline = Ent
  29.     Else
  30.         MsgBox ("Must be a pline.")
  31.         Exit Sub
  32.     End If
  33.    
  34.     On Error Resume Next
  35.     Dim keywordList As String
  36.     keywordList = "Block"
  37.     Util.InitializeUserInput 128, keywordList
  38.     Dim Answer As String
  39.     div = Util.GetInteger(vbCr & "Enter the number of segments or [Block]:   ")
  40.     If Err Then
  41.         If StrComp(Err.Description, "User input is a keyword", 1) = 0 Then
  42.             Err.Clear
  43.             Answer = ThisDrawing.Utility.GetInput
  44.             If Answer = "Block" Then
  45.                 bBlock = True
  46.                 sBlock = Util.GetString(False, "Enter name of block to insert:")
  47.                 If sBlock = "" Then Exit Sub
  48.                 Dim oBlock As AcadBlock
  49.                 Set oBlock = ThisDrawing.Blocks(sBlock)
  50.                 If Err.Description = "Key not found" Then
  51.                     Exit Sub
  52.                 Else
  53.                     div = Util.GetInteger(vbCr & "Enter the number of segments :  ")
  54.                     
  55.                 End If
  56.             Else: Exit Sub
  57.             End If
  58.         End If
  59.      End If
  60.     On Error GoTo 0
  61.    
  62.    
  63.    
  64.     If Not div > 1 Then Exit Sub
  65.     unitL = oPline.Length / div
  66.     Elev = oPline.Elevation
  67.     cnt = (UBound(oPline.Coordinates) - 1) / 2
  68.     If oPline.Closed = True Then
  69.         CCnt = cnt + 1
  70.     Else
  71.         CCnt = cnt
  72.     End If
  73.    
  74.     For i = 0 To CCnt - 1
  75.         C1 = oPline.Coordinate(i)
  76.         If i = cnt Then
  77.             C2 = oPline.Coordinate(0)
  78.         Else
  79.             C2 = oPline.Coordinate(i + 1)
  80.         End If
  81.         C(0) = C1: C(1) = C2
  82.         dLength = segLength(C1, C2)
  83.         C(5) = dLength
  84.         dBulge = oPline.GetBulge(i)
  85.         C(3) = dBulge
  86.         If dBulge  0 Then
  87.            'converting bulge to angle in radians  ang=Atn(dBulge) * 4
  88.             Ang = Atn(dBulge) * 2
  89.             dLength = Ang * dLength / Sin(Ang)
  90.             C(4) = dLength
  91.         End If
  92.         Total = Total + dLength
  93.         C(2) = Total
  94.         CoordCol.Add C
  95.     Next i
  96.    
  97.     dLength = 0
  98.     K = 1
  99.     For i = 1 To div - 1
  100.         dLength = dLength + unitL
  101.         For j = K To CCnt
  102.             If CoordCol(j)(2) >= dLength Then
  103.                 Exit For
  104.             End If
  105.         Next j
  106.         If j > 1 Then
  107.             K = j - 1
  108.             Dist = dLength - CoordCol(K)(2)
  109.         Else
  110.             K = j
  111.             Dist = dLength
  112.         End If
  113.         dBulge = CoordCol(j)(3)
  114.         If dBulge = 0 Then
  115.             p = PtonLine(CoordCol(j)(0), CoordCol(j)(1), Dist, Tan)
  116.         Else
  117.             p = PtonArc(CoordCol(j), Dist, Tan)
  118.         End If
  119.      
  120.         p(2) = Elev
  121.         p = ThisDrawing.Utility.TranslateCoordinates(p, acOCS, acWorld, 0, oPline.Normal)
  122.         If bBlock Then
  123.             Set oBref = ThisDrawing.ModelSpace.InsertBlock(p, sBlock, 1, 1, 1, Tan)
  124.             Dim Zero(2) As Double
  125.             oBref.Normal = oPline.Normal
  126.             oBref.InsertionPoint = p
  127.         Else
  128.             ThisDrawing.ModelSpace.AddPoint p
  129.         End If
  130.     Next i
  131. End Sub
  132. Function PtonLine(C1 As Variant, C2 As Variant, Dist As Double, Ang As Double) As Variant
  133.     'X = X1 + distance / dLength * DX
  134.     Dim X As Double, Y As Double
  135.     Dim Dx As Double, dY As Double
  136.     Dim dLength As Double
  137.     Dim p(2) As Double
  138.         
  139.     X = C1(0): Y = C1(1)
  140.     Dx = C2(0) - X: dY = C2(1) - Y
  141.     dLength = Dist / Sqr(Dx * Dx + dY * dY)
  142.     p(0) = X + (dLength * Dx)
  143.     p(1) = Y + (dLength * dY)
  144.     PtonLine = p
  145.     Ang = AngFromX(C1, C2)
  146. End Function
  147. Function segLength(C1 As Variant, C2 As Variant) As Double
  148.     Dim Dx As Double, dY As Double
  149.     Dx = C2(0) - C1(0): dY = C2(1) - C1(1)
  150.     segLength = Sqr(Dx * Dx + dY * dY)
  151. End Function
  152. Function ArcLength(C1 As Variant, C2 As Variant, SegmentLength As Double, dBulge As Double) As Double
  153.     Dim Ang As Double
  154.     Ang = Atn(dBulge) * 2 'converting bulge to angle in radians  ang=Atn(dBulge) * 4
  155.     ArcLength = Ang * SegmentLength / Sin(Ang)
  156. End Function
  157. Function PtonArc(C As Variant, Dist As Double, Tan As Double) As Variant
  158.     'X = X1 + distance / dLength * DX
  159.     Dim dBulge As Double
  160.     Dim dLength As Double
  161.     Dim p(2) As Double
  162.     Dim Ang As Double, Ang2 As Double
  163.     Dim Seg As Double
  164.     Dim segAng As Double, AngToCen
  165.     Dim Rad As Double
  166.     Dim CenPt(1) As Double
  167.     Dim C1, C2
  168.     Dim PosNeg As Integer
  169.       
  170.     C1 = C(0): C2 = C(1)
  171.     dBulge = C(3)
  172.     Seg = C(5)
  173.     Ang = Atn(dBulge) * 2 'converting bulge to angle in radians= Atn(dBulge) * 4
  174.    
  175.     Rad = Abs(Seg / (2 * Sin(Ang)))
  176.     segAng = AngFromX(C1, C2)
  177.    
  178.     If dBulge > 0 Then
  179.         PosNeg = 1
  180.         AngToCen = segAng + ((0.5 * pi) - Ang)
  181.     Else
  182.         PosNeg = -1
  183.         AngToCen = segAng - ((0.5 * pi) + Ang)
  184.     End If
  185.     CenPt(0) = C1(0) + Cos(AngToCen) * Rad
  186.     CenPt(1) = C1(1) + Sin(AngToCen) * Rad
  187.    
  188.     If AngToCen  0
  189.     p(0) = CenPt(0) + (Cos(Ang) * Rad)
  190.     p(1) = CenPt(1) + (Sin(Ang) * Rad)
  191.     PtonArc = p
  192.    
  193. End Function
  194. Public Function AngFromX(P1, P2) As Double
  195.    
  196.     'If Not PointCheck(p1, p2) Then Exit Function
  197.     Dim Dx As Double, dY As Double
  198.     Dim dAng As Double
  199.     dY = P2(1) - P1(1): Dx = P2(0) - P1(0)
  200.     If Rd(dY, 0) Then  'Line is horizontal
  201.         If Rd(Dx, 0) Then Exit Function
  202.         If Dx > 0 Then
  203.             dAng = 0
  204.         Else
  205.             dAng = pi '180
  206.         End If
  207.     ElseIf Rd(Dx, 0) Then  'Line is vertical
  208.         If dY > 0 Then
  209.             dAng = 0.5 * pi '90
  210.         Else
  211.             dAng = 1.5 * pi '270
  212.         End If
  213.     Else
  214.         dAng = Atn(dY / Dx)
  215.         If dAng 270
  216.             If Dx 270
  217.                 dAng = pi + dAng '90->180
  218.             Else '270->360
  219.                 dAng = 2 * pi + dAng
  220.             End If
  221.         Else
  222.             If Dx 270
  223.                 dAng = pi + dAng
  224.             End If
  225.         End If
  226.     End If
  227.     AngFromX = dAng
  228. End Function
  229. Function Rd(num1 As Variant, num2 As Variant) As Boolean
  230.     If Abs(num1 - num2) < 0.00000001 Then Rd = True
  231. End Function

回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-12-28 09:22:19 | 显示全部楼层
在测试这一点时,我发现acad divide命令对于一个时髦的ucs(2008版)来说是不正确的,这让我感到非常惊讶。本人&#039;我们添加了一个图形来显示它,要插入的块是;b;。我的代码也是这样做的,直到我在0,0,0处添加了块,更改了法线以匹配pline,然后更改了它&#039;s insertion指向正确的一个
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2007-12-28 11:46:07 | 显示全部楼层
杰夫,那&#039;这正是问题所在,谢谢你的提示
Bryco,I&#039;我一直在努力避免弯道。cls,但不是#039;我不太确定该怎么办。谢谢你的帮助!本人&#039;这个周末我可能会仔细看看
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-5 13:22 , Processed in 0.561612 second(s), 73 queries .

© 2020-2025 乐筑天下

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