明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: 逆风的香

VB控制AUTOCAD求三个面域并集求助

[复制链接]
 楼主| 发表于 2013-10-4 22:15:48 | 显示全部楼层
运行:“生成AUTOCAD程序对象按钮”,再点取:“计算隔热型材截面特性”至“请选择断热条一侧的面域部分!”按:“确定”后选择一侧面域,点取“请选择断热条另一侧的面域部分!” 按:“确定”后选择另一侧面域,再利用选择集将三个面域求并集。
现在提取的截面特性第一个面域,第二个面域都正确,求并集后的截面特性提取错误,在求并集过程中如果先选择第一个面域,求并集后提取的截面特性就为第一个面域的,反之,在求并集过程中如果先选择第二个面域,求并集后提取的截面特性就为第二个面域的,实际我们求并集后需提取的截面特性为求并集后的截面特性。但不希望在求完并集后再次单选择求并集后的截面去提取并集后截面特性。
源代码如下:
公共变量设置:
Public Ix0 As Double, Iy0 As Double
Public Ix1 As Double, Iy1 As Double
Public Ix2 As Double, Iy2 As Double
Public Wx10 As Double, Wx20 As Double
Public Wx11 As Double, Wx21 As Double
Public Wx12 As Double, Wx22 As Double
Public Wy10 As Double, Wy20 As Double
Public Wy11 As Double, Wy21 As Double
Public Wy12 As Double, Wy22 As Double
Public Sx0 As Double, Sy0 As Double
Public Sx1 As Double, Sy1 As Double
Public Sx2 As Double, Sy2 As Double
Public A0 As Double, A1 As Double, A2 AsDouble
计算部分源代码:
Private Sub Command15_Click()
'选择对像
Form1.Hide
Dim MyEnty As AcadEntity, basPoint AsVariant
Dim MySel As AcadSelectionSet
Dim MinPoAs Variant, MaxPo As Variant
Dim LeftPo(2) As Double, RightPo(2) AsDouble
Call formTotop(acadApp.hwnd)
'提示用户选择
On Error Resume Next
ReSele:
MsgBox "请选择断热条一侧的面域部分!", vbOKOnly, "说明" 选择第一个面域
acadDoc.Utility.GetEntity MyEnty, basPoint,"选择对象:"
If Err.Number <> 0 Then
   If CheckKey(VK_ESCAPE) = True Or CheckKey(VK_MRight) = True Then
       Me.Show
       Exit Sub
   Else
        GoTo ReSele
   End If
End If
If Not (MyEnty Is Nothing) Then
   If MyEnty.ObjectName = "AcDbRegion" Then
       '计算特性
       Call Xcdm(acadDoc, MyEnty)         提取第一个面域的截面特性
       A0 = Round(SS * 100, 3)             第一个面域的截面特性输入公共变量中
       Ix0 = Round(IIx, 3)
       Iy0 = Round(IIy, 3)
       Wx10 = Round(WWx1, 3)
       Wx20 = Round(WWx2, 3)
       Wy10 = Round(WWy1, 3)
       Wy20 = Round(WWy2, 3)
       If SSx1SSx2 Then
         Sx0 = Round(SSx1, 3)
       Else
         Sx0 = Round(SSx2, 3)
       End If
       If SSy1SSy2 Then
         Sy0 = Round(SSy1, 3)
       Else
         Sy0 = Round(SSy2, 3)
       End If
   Else
       MsgBox "当前选择对像不是一个面域,请重新选择!",vbOKOnly, "运行提示"
   End If
End If
MsgBox "请选择断热条另一侧的面域部分!", vbOKOnly, "说明"  选择第二个面域
acadDoc.Utility.GetEntity MyEnty, basPoint,"选择对象:"
If Err.Number <> 0 Then
   If CheckKey(VK_ESCAPE) = True Or CheckKey(VK_MRight) = True Then
       Me.Show
       Exit Sub
   Else
       GoTo ReSele
   End If
End If
If Not (MyEnty Is Nothing) Then
   If MyEnty.ObjectName = "AcDbRegion" Then
       '计算特性
       Call Xcdm(acadDoc, MyEnty)         提取第二个面域的截面特性
       A1 = Round(SS * 100, 3)             第一个面域的截面特性输入公共变量中
       Ix1 = Round(IIx, 3)
       Iy1 = Round(IIy, 3)
       Wx11 = Round(WWx1, 3)
       Wx21 = Round(WWx2, 3)
       Wy11 = Round(WWy1, 3)
       Wy21 = Round(WWy2, 3)
       If SSx1SSx2 Then
         Sx1 = Round(SSx1, 3)
       Else
         Sx1 = Round(SSx2, 3)
       End If
       If SSy1SSy2 Then
         Sy1 = Round(SSy1, 3)
       Else
         Sy1 = Round(SSy2, 3)
       End If
   Else
       MsgBox "当前选择对像不是一个面域,请重新选择!",vbOKOnly, "运行提示"
   End If
End If
MsgBox "请选择断热条及铝合金的全部面域部分!", vbOKOnly, "说明" 将第一、二个面域及隔热条求并集
   Dim RoomObjects(0 To 2) As AcadRegion
   Dim curvers() As AcadEntity
   Dim ssetobj As AcadSelectionSet
   On Error Resume Next
   Set ssetobj =acadApp.ActiveDocument.SelectionSets.Add("example")
   If Err Then
       Set ssetobj = acadApp.ActiveDocument.SelectionSets.Item("example")
       ssetobj.Clear
       Err.Clear
   End If
   Dim FT(6) As Integer, FD(6) As Variant, E As AcadEntity, I As Integer, JAs Integer, K As Integer
   FT(0) = -4: FD(0) = "<OR"
   FT(1) = 0: FD(1) = "Circle"
   FT(2) = 0: FD(2) = "Ellipse"
    FT(3) = 0: FD(3) = "LWPolyline"
    FT(4) = 0: FD(4) = "SPLine"
    FT(5) = 0: FD(5) = "Region"
    FT(6) = -4: FD(6) ="OR>"
   ssetobj.SelectOnScreen FT, FD
   For Each E In ssetobj
       If E.ObjectName = "AcDbRegion" Then
           Set RoomObjects(I) = E
           I = I + 1
       Else
           ReDim Preserve curvers(J)
           Set curvers(J) = E
           J = J + 1
       End If
   Next
   ssetobj.Delete
   Dim regions As Variant
   If I < 3 Then
       regions = acadApp.ActiveDocument.ModelSpace.AddRegion(curvers)
       If Err Then
           MsgBox "边界错误", vbCritical, "AutoCAD"
           Exit Sub
       End If
   End If
   For J = I To 2
       Set RoomObjects(J) = regions(J - I)
    Next
   For I = 1 To 2
       RoomObjects(0).Boolean acUnion, RoomObjects(I)
   Next
   ZoomExtents
If Err.Number <> 0 Then
   If CheckKey(VK_ESCAPE) = True Or CheckKey(VK_MRight) = True Then
       Me.Show
       Exit Sub
   Else
       GoTo ReSele
   End If
End If
If Not (MyEnty Is Nothing) Then
   If MyEnty.ObjectName = "AcDbRegion" Then
       '计算特性
       Call Xcdm(acadDoc, MyEnty)               提取求并集后的截面特性
       A2 = Round(SS * 100, 3)             求并集后面域的截面特性输入公共变量中
       Ix2 = Round(IIx, 3)
       Iy2 = Round(IIy, 3)
       Wx12 = Round(WWx1, 3)
       Wx22 = Round(WWx2, 3)
       Wy12 = Round(WWy1, 3)
       Wy22 = Round(WWy2, 3)
       If SSx1SSx2 Then
         Sx2 = Round(SSx1, 3)
       Else
         Sx2 = Round(SSx2, 3)
       End If
       If SSy1SSy2 Then
         Sy2 = Round(SSy1, 3)
       Else
         Sy2 = Round(SSy2, 3)
       End If
   Else
       MsgBox "当前选择对像不是一个面域,请重新选择!",vbOKOnly, "运行提示"
   End If
End If
   通过文本栏输出提取的截面特性(可以提取第一个面域特性,第二个面域特性及求并集后的面域特性)
        Text9.Text = A1  
       Text1.Text = Ix1
       Text2.Text = Iy1
       Text3.Text = Wx11
       Text4.Text = Wx21
       Text5.Text = Wy11
       Text6.Text = Wy21
       If SSx1SSx2 Then
         Text7.Text = Sx1
       Else
         Text7.Text = Sx1
       End If
       If SSy1SSy2 Then
         Text8.Text = Sy1
       Else
         Text8.Text = Sy1
       End If
Form1.Show
End Sub

本帖子中包含更多资源

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

x
 楼主| 发表于 2013-10-6 07:54:12 | 显示全部楼层
问题解决啦!新手提的问题比较模糊,见谅!谢谢大家!
发表于 2020-7-3 14:48:12 | 显示全部楼层
woaishuijia 发表于 2013-10-2 16:24
本以为你这段代码是试验用的,只针对特殊情况.原来你在做面域这一步就理解错了
下面详细剖析一下你这段代码 ...

老师太热心了!感谢老师的答疑解惑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 05:28 , Processed in 0.132231 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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