明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2069|回复: 4

不知道是什么回事?

[复制链接]
发表于 2003-7-28 20:50:00 | 显示全部楼层 |阅读模式
用break来裁剪一个闭合多段线的时候,有时候裁掉的部分是另外部分,而留下我想裁减的那部分:(


所以用vba的sendcommand结合双元表,可能会导致以上后果
发表于 2003-7-28 21:01:00 | 显示全部楼层
最好不要另起贴子讨论。
我在上个贴子已经说得很清楚了,这种操作方法与双元表没有关系,而是你的程序本身有问题。
 楼主| 发表于 2003-7-28 21:27:00 | 显示全部楼层
但这个现象确实不是在程序里面才出现,

直接在CAD里面用break命令来操作有时就会出现那种情况,我在画图的时候就遇到过很多次
发表于 2003-7-28 22:06:00 | 显示全部楼层
我已经跟你说过了,你可以使用偏移的方法,求偏移线直选择集线的交点,再通过交点来形成双元表实施修剪,这样可以很准确。如下(环境是VBA):
  1. Sub Trim()
  2.     Dim acadapp As AcadApplication
  3.     Dim acaddoc As AcadDocument
  4.     '此句用于VBA
  5.     Set acadapp = ThisDrawing.Application
  6.     '此名用于VB
  7.     'Set acadapp = connectcad(acadapp)
  8.     Set acaddoc = acadapp.ActiveDocument
  9.     '此句用于VB
  10.     'AppActivate acadapp.Caption '让CAD得到焦点
  11.    
  12.    
  13.     Dim Pnt1 As Variant
  14.     Dim entObj1 As AcadEntity
  15.     acaddoc.Utility.GetEntity entObj1, Pnt1, "选择修剪边界:"
  16.     Dim det1 As String
  17.     det1 = axEnt2lspEnt(entObj1)
  18.    
  19.     Dim entObjOff As AcadEntity
  20.     Dim entObjOffs As Variant
  21.    
  22.     '控制偏移的距离和方向的参数
  23.     Dim OffDist As Double
  24.     OffDist = 0.5
  25.     entObjOffs = entObj1.Offset(OffDist)
  26.     Set entObjOff = entObjOffs(0)
  27.    

  28.     Dim Pnt2 As Variant
  29.     Dim entObj2 As AcadEntity
  30.    
  31.     Dim sle1 As AcadSelectionSet
  32.    
  33.    
  34.     On Error Resume Next
  35.    
  36.     Set sle1 = acaddoc.SelectionSets.Item("sle1")
  37.     sle1.Clear
  38.     If Err Then
  39.     Err.Clear
  40.     Set sle1 = acaddoc.SelectionSets.Add("sle1")
  41.     End If
  42.    
  43.     acaddoc.Utility.Prompt "选择需要修剪的对象" & Chr(13)
  44.    
  45.     sle1.SelectOnScreen
  46.    
  47.     'Pnt2 = acaddoc.Utility.GetPoint(, "选择修剪方向")
  48.     Dim det2 As String
  49.    
  50.     Dim IntPnt As Variant
  51.     Dim IntPnt1(2) As Double
  52.     Dim n As Integer
  53.     For Each entObj2 In sle1
  54.     IntPnt = entObj2.IntersectWith(entObjOff, acExtendNone)
  55.    
  56.     If IsArray(IntPnt) Then
  57.         For n = 0 To UBound(IntPnt) Step 3
  58.             IntPnt1(0) = IntPnt(n + 0)
  59.             IntPnt1(1) = IntPnt(n + 1)
  60.             IntPnt1(2) = IntPnt(n + 2)
  61.             det2 = GetDoubleEntTable(entObj2, IntPnt1)
  62.             acaddoc.SendCommand "_trim" & vbCr & det1 & vbCr & vbCr & det2 & vbCr & vbCr
  63.         Next
  64.     End If
  65.     Next
  66.    
  67.     entObjOff.Delete
  68.    
  69.     Dim command_str As String
  70.     command_str = Chr(3) & Chr(3)
  71.     acaddoc.SendCommand command_str
  72.     acaddoc.Utility.Prompt "修剪完成!"
  73.     acaddoc.SendCommand command_str
  74.    
  75.     'Set acadapp = Nothing
  76.     End
  77.    

  78. End Sub

  79. '转换双元表的函数

  80. Public Function GetDoubleEntTable(entObj As AcadEntity, Pnt As Variant) As String
  81.     Dim entHandle As String
  82.     entHandle = entObj.Handle
  83.     GetDoubleEntTable = "(list(handent " & Chr(34) & entHandle & Chr(34) & _
  84.                      ")(list " & Str(Pnt(0)) & Str(Pnt(1)) & Str(Pnt(2)) & "))"
  85. End Function

  86. '转换点的函数

  87. Public Function axPoint2lspPoint(Pnt As Variant) As String
  88.     axPoint2lspPoint = Pnt(0) & "," & Pnt(1) & "," & Pnt(2)
  89. End Function

  90. '转换图元函数

  91. Public Function axEnt2lspEnt(entObj As AcadEntity) As String
  92.     Dim entHandle As String
  93.     entHandle = entObj.Handle
  94.     axEnt2lspEnt = "(handent " & Chr(34) & entHandle & Chr(34) & ")"
  95. End Function


  96. Function connectcad(acadapp As AcadApplication) As AcadApplication '连接AUTOCAD


  97. On Error Resume Next
  98.      
  99.     '与autocad通信
  100.      
  101.     Set acadapp = GetObject(, "AutoCAD.Application")
  102.     If Err Then
  103.         Err.Clear
  104.         Set acadapp = CreateObject("AutoCAD.Application")
  105.         If Err Then
  106.             MsgBox Err.Description
  107.             Exit Function
  108.         End If
  109.     End If
  110. Set connectcad = acadapp
  111. End Function

  112. 'Private Sub Form_Initialize()
  113. 'Trim
  114. 'End Sub

以下为程序运行后的效果

本帖子中包含更多资源

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

x
发表于 2011-10-27 09:27:42 | 显示全部楼层
为什么你这个方法有些线不能剪掉,或者剪掉了相反的部分
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-29 10:35 , Processed in 0.164564 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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