`
yuanlanxiaup
  • 浏览: 896267 次
文章分类
社区版块
存档分类
最新评论

获取CAD中线的每个节点坐标程序设计(一)

 
阅读更多

获取CAD中线的每个节点坐标,线包括polyline、3D polyline、Spline等等!

程序代码如下:


Imports System
Imports System.IO
Imports System.Math
Public Class 获取CAD中点坐标
Public AcadApp As AutoCAD.AcadApplication
Public xx(), yy(), zz() As Double
Public Count As Integer
Public returnObj As Object
Public FolderPath As String = "C:/"
Public StepNum As Integer = 0
Private Declare Auto Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal procHandle As IntPtr, ByVal min As Int32, ByVal max As Int32) As Boolean
Public Sub SetProcessWorkingSetSize() '节约系统内存
Try
Dim Mem As Process
Mem = Process.GetCurrentProcess()
SetProcessWorkingSetSize(Mem.Handle, -1, -1)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Public Sub 启动CAD()
On Error Resume Next
AcadApp = GetObject(, "AutoCAD.Application")
If Err.Number Then
Err.Clear()
AcadApp = CreateObject("AutoCAD.Application")
End If
AcadApp.Visible = True
AcadApp.WindowState = AutoCAD.AcWindowState.acMax
AppActivate(AcadApp.Caption)
End Sub
Public Sub 获取样条线节点坐标()
Dim i As Integer
For i = 0 To 10000 Step StepNum
On Error GoTo handle01
Count = i
ReDim Preserve xx(i)
ReDim Preserve yy(i)
ReDim Preserve zz(i)
xx(i) = returnObj.Coordinate(i)(0)
yy(i) = returnObj.Coordinate(i)(1)
zz(i) = returnObj.elevation
Next
handle01:
Count = Count - 1
End Sub
Public Sub 获取Spline线节点坐标()
Dim fitPoints As Object
Dim i As Integer
For i = 0 To returnObj.NumberOfControlPoints - 1 Step StepNum
fitPoints = returnObj.GetControlPoint(i)
Count = i
ReDim Preserve xx(i)
ReDim Preserve yy(i)
ReDim Preserve zz(i)
xx(i) = fitPoints(0)
yy(i) = fitPoints(1)
zz(i) = fitPoints(2)
Next
End Sub
Public Sub 获取Spline线拟合点坐标()
Dim fitPoints As Object
Dim pp As AutoCAD.AcadSpline
Dim i As Integer
For i = 0 To returnObj.NumberOfFitPoints - 1 Step StepNum
fitPoints = returnObj.GetFitPoint(i)
Count = i
ReDim Preserve xx(i)
ReDim Preserve yy(i)
ReDim Preserve zz(i)
xx(i) = fitPoints(0)
yy(i) = fitPoints(1)
zz(i) = fitPoints(2)
Next
End Sub

Public Sub 获取line线节点坐标()
Dim StartPoints As Object
Dim EndPoints As Object
ReDim Preserve xx(1)
ReDim Preserve yy(1)
ReDim Preserve zz(1)
Count = 1
returnObj.highlight(True)
StartPoints = returnObj.StartPoint
EndPoints = returnObj.EndPoint
xx(0) = StartPoints(0)
yy(0) = StartPoints(1)
zz(0) = StartPoints(2)
xx(1) = EndPoints(0)
yy(1) = EndPoints(1)
zz(1) = EndPoints(2)
End Sub
Public Sub 获取2DPolyline节点坐标()
'Dim sss As AutoCAD.AcadLWPolyline
returnObj.highlight(True)
Dim i As Integer
For i = 0 To 10000 Step StepNum
On Error GoTo handle01
Count = i
ReDim Preserve xx(i)
ReDim Preserve yy(i)
ReDim Preserve zz(i)
xx(i) = returnObj.Coordinate(i)(0)
yy(i) = returnObj.Coordinate(i)(1)
zz(i) = returnObj.elevation
Next
handle01:
Count = Count - 1
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
On Error GoTo handle01
Call 启动CAD()
Dim basePnt As Object
AcadApp.ActiveDocument.Utility.GetEntity(returnObj, basePnt)
returnObj.highlight(True)
'判断线的类型
Dim LineTypenName As String
LineTypenName = returnObj.ObjectName.ToString()
If LineTypenName = "AcDbLine" Then
Call 获取line线节点坐标()
ElseIf LineTypenName = "AcDbSpline" Then
Call 获取Spline线节点坐标()
ElseIf LineTypenName = "AcDbPolyline" Then
Call 获取样条线节点坐标()
Else : Exit Sub
End If
If TextBox1.Text <> 0 Or TextBox2.Text <> 0 Or TextBox4.Text <> 0 Then
Call CalculateCoordinate()
End If
Dim i As Integer
Dim s As String = ""
For i = 0 To Count
s = s + xx(i).ToString() + "," + yy(i).ToString() + "," + zz(i).ToString() + Chr(13)
Next
RichTextBox1.Text = s
Button3.Enabled = True
AppActivate(Me.Text)
Exit Sub
handle01:
MsgBox(Err.Description)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
On Error GoTo handle01
Dim dg As New OpenFileDialog
dg.Filter = "CAD files (*.dwg)|*.dwg|All files (*.*)|*.*"
dg.ShowDialog()
Dim s As String = dg.FileName
If s = "" Then Exit Sub
启动CAD()
AcadApp.Application.Documents.Open(s)
AcadApp.ActiveDocument.WindowState = AutoCAD.AcWindowState.acMax
AppActivate(Me.Text)
Button1.Enabled = True
Exit Sub
handle01:
MsgBox(Err.Description)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
On Error GoTo handle01
Dim dg As New SaveFileDialog
dg.Filter = "txt files (*.txt)|*.txt|dat files (*.dat)|*.dat"
dg.ShowDialog()
Dim s As String = dg.FileName
Dim i As Integer
Dim s1 As String = ""
Using sw As StreamWriter = New StreamWriter(s)
For i = 0 To Count
s1 = xx(i).ToString() + "," + yy(i).ToString() + "," + zz(i).ToString()
sw.WriteLine(s1)
Next
sw.Close()
End Using
Exit Sub
handle01:
MsgBox(Err.Description)
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
AcadApp.ActiveDocument.Regen(AutoCAD.AcRegenType.acActiveViewport)
End Sub
Public Sub CalculateCoordinate()
On Error GoTo handle01
Dim x0, y0, Rotangle As Double
x0 = TextBox1.Text
y0 = TextBox2.Text
Rotangle = (TextBox4.Text) * 3.1415926 / 180
Dim i As Integer
Dim x1, y1 As Double
If Cos(Rotangle) = 0 Then
For i = 0 To Count
x1 = xx(i)
xx(i) = yy(i) - y0
yy(i) = x0 - x1
Next
Exit Sub
End If
For i = 0 To Count
y1 = (yy(i) - y0 - (xx(i) - x0) * Tan(Rotangle)) * Cos(Rotangle)
x1 = (xx(i) - x0) / Cos(Rotangle) + y1 * Tan(Rotangle)
If Abs(x1) < 0.00001 Then x1 = 0 '设置精度
If Abs(y1) < 0.00001 Then y1 = 0
xx(i) = x1
yy(i) = y1
Next
Exit Sub
handle01:
MsgBox(Err.Description)
End Sub
Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
End Sub
Private Sub 批量获取节点坐标Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 批量获取节点坐标Button.Click
Static ExitNum As Integer
On Error GoTo handle01
Static SaveNum As Integer
Call 启动CAD()
Dim basePnt As Object
AcadApp.ActiveDocument.Utility.GetEntity(returnObj, basePnt)
returnObj.highlight(True)
AcadApp.ActiveDocument.SendCommand("@选取下一条线!连续在空白地方点击两次将会自动退出批量存储状态!" + vbCr)
'判断线的类型
Dim LineTypenName As String
LineTypenName = returnObj.ObjectName.ToString()
If LineTypenName = "AcDbLine" Then
Call 获取line线节点坐标()
ElseIf LineTypenName = "AcDbSpline" Then
Call 获取Spline线节点坐标()
ElseIf LineTypenName = "AcDbPolyline" Then
Call 获取样条线节点坐标()
End If
If TextBox1.Text <> 0 Or TextBox2.Text <> 0 Or TextBox4.Text <> 0 Then
Call CalculateCoordinate()
End If
Dim j As Integer
Dim s1 As String = ""
Using sw As StreamWriter = New StreamWriter(FolderPath + SaveNum.ToString() + ".txt")
For j = 0 To Count
s1 = xx(j).ToString() + "," + yy(j).ToString() + "," + zz(j).ToString()
sw.WriteLine(s1)
Next
sw.Close()
SaveNum = SaveNum + 1
End Using
ExitNum = 0
Call 批量获取节点坐标Button_Click(sender, e)
Exit Sub
handle01:
ExitNum = ExitNum + 1
If ExitNum = 2 Then
ExitNum = 0
Exit Sub
Else : Call 批量获取节点坐标Button_Click(sender, e)
End If
End Sub
Private Sub 设置文件保存路径Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 设置文件保存路径Button5.Click
Dim fdg As FolderBrowserDialog
fdg = New FolderBrowserDialog
fdg.ShowDialog()
If fdg.SelectedPath = "" Then Exit Sub
FolderPath = fdg.SelectedPath
End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
On Error GoTo Handle01
Call 启动CAD()
Dim sset As AutoCAD.AcadSelectionSet
sset = AcadApp.ActiveDocument.SelectionSets.Add("NewSelectionSet")
' 提示用户选择对象
sset.SelectOnScreen()
Dim ent As Object
Dim sss As AutoCAD.AcadPoint
Count = -1
For Each ent In sset
If ent.Objectname = "AcDbPoint" Then
Count = Count + 1
ReDim Preserve xx(Count)
ReDim Preserve yy(Count)
ReDim Preserve zz(Count)
xx(Count) = ent.Coordinates(0)
yy(Count) = ent.Coordinates(1)
zz(Count) = ent.Coordinates(2)
End If
Next ent
If TextBox1.Text <> 0 Or TextBox2.Text <> 0 Or TextBox4.Text <> 0 Then
Call CalculateCoordinate()
End If
Dim i As Integer
Dim s As String = ""
For i = 0 To Count
s = s + xx(i).ToString() + "," + yy(i).ToString() + "," + zz(i).ToString() + Chr(13)
Next
RichTextBox1.Text = s
AcadApp.ActiveDocument.SelectionSets.Item("NewSelectionSet").Delete()
AppActivate(Me.Text)
Button3.Enabled = True
Exit Sub
Handle01:
AcadApp.ActiveDocument.SelectionSets.Item("NewSelectionSet").Delete()
Button5_Click(sender, e)
MsgBox(Err.Description)
End Sub
Private Sub Button6_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
On Error GoTo Handle01
AcadApp.ActiveDocument.Save()
Handle01:
MsgBox(Err.Description)
End Sub
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
Call 启动CAD()
Dim basePnt As Object
AcadApp.ActiveDocument.Utility.GetEntity(returnObj, basePnt)
returnObj.highlight(True)
AppActivate(AcadApp.Caption)
Dim i As Integer
For i = 0 To 500
On Error GoTo handle01
Count = i
ReDim Preserve xx(i)
ReDim Preserve yy(i)
ReDim Preserve zz(i)
xx(i) = returnObj.Coordinate(i)(0)
yy(i) = returnObj.Coordinate(i)(1)
zz(i) = returnObj.Coordinate(i)(2)
Next
handle01:
Count = Count - 1
Dim j As Integer
Dim s As String = ""
For j = 0 To Count
s = s + xx(j).ToString() + "," + yy(j).ToString() + "," + zz(j).ToString() + Chr(13)
Next
RichTextBox1.Text = s
Button3.Enabled = True
AppActivate(Me.Text)
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Call SetProcessWorkingSetSize()
End Sub
Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
On Error GoTo handle01
Call 启动CAD()
Dim basePnt As Object
AcadApp.ActiveDocument.Utility.GetEntity(returnObj, basePnt)
returnObj.highlight(True)
Call 获取2DPolyline节点坐标()
If TextBox1.Text <> 0 Or TextBox2.Text <> 0 Or TextBox4.Text <> 0 Then
Call CalculateCoordinate()
End If
Dim i As Integer
Dim s As String = ""
For i = 0 To Count
s = s + xx(i).ToString() + "," + yy(i).ToString() + "," + zz(i).ToString() + Chr(13)
Next
RichTextBox1.Text = s
Button3.Enabled = True
AppActivate(Me.Text)
Exit Sub
handle01:
MsgBox(Err.Description)
End Sub
Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
Call 启动CAD()
Dim basePnt As Object
basePnt = AcadApp.ActiveDocument.Utility.GetPoint()
MsgBox("当前点击坐标位置为:X=" + basePnt(0).ToString() + ",Y=" + basePnt(1).ToString())
End Sub
Private Sub 打开CAD文件OToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 打开CAD文件OToolStripMenuItem.Click
On Error GoTo handle01
Dim dg As New OpenFileDialog
dg.Filter = "CAD files (*.dwg)|*.dwg|All files (*.*)|*.*"
dg.ShowDialog()
Dim s As String = dg.FileName
If s = "" Then Exit Sub
启动CAD()
AcadApp.Application.Documents.Open(s)
AcadApp.ActiveDocument.WindowState = AutoCAD.AcWindowState.acMax
AppActivate(Me.Text)
Button1.Enabled = True
Exit Sub
handle01:
MsgBox(Err.Description)
End Sub
Private Sub 保存CAD文件CToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 保存CAD文件CToolStripMenuItem.Click
On Error GoTo Handle01
AcadApp.ActiveDocument.Save()
Exit Sub
Handle01:
MsgBox(Err.Description)
End Sub
<!--v:3.2-->
分享到:
评论

相关推荐

    VB制作 VB自动获取CAD内点、线坐标

    标题中的“VB制作 VB自动获取CAD内点、线坐标”是指使用Visual Basic(VB)编程语言来开发一个程序,该程序能够自动读取并提取AutoCAD(CAD)软件中的点和线的坐标信息。这个小工具对于那些需要进行CAD数据处理或者...

    提取CAD坐标至Excel

    - 在AutoCAD中,每个对象都有一个起点坐标和终点坐标,定义了它的位置和尺寸。 2. **提取坐标的方法** - **命令行操作**:在AutoCAD中,可以使用“LIST”或“DI”命令查看对象的坐标。例如,“LIST”命令会显示...

    中线CAD软件基本操作流程

    该功能可以给图纸上的每一个连接器块或虚拟块生成一个唯一的位置标识(如P1~P15)。生成的端位顺序是按照从左向右,从上到下的顺序进行。 在图纸转换的基础操作中,还包括插入分支点,设置位置归属,插入节点长度等...

    ZX中心线V1.0_LSP_cad中心线lsp_ZX中心线V1.0_生成中线_CAD插件_

    "ZX中心线V1.0_LSP_cad中心线lsp_ZX中心线V1.0_生成中线_CAD插件_"这个标题揭示了一个专为CAD设计的插件,它的主要功能是生成平行线的中线。此插件版本号为V1.0,意味着它可能是一个初始版本,但已经具备了基本的...

    中线逐桩坐标计算原理

    中线逐桩坐标计算原理很好用的看一下你就会了解的。

    cad Z坐标 归零.lsp

    cad编辑时经常遇到线不共面的情况,该小程序可以轻松解决cad中线不共面问题

    mapinfo中提取点坐标

    总的来说,MapInfo中的坐标提取是一个简单但非常实用的功能,它使得从地图对象中获取精确的地理位置信息变得容易,这对于地理数据分析、制图以及位置服务等多种应用都是至关重要的。熟练掌握这个操作,将使你在GIS...

    中线CAD基础操作流程.pdf

    根据提供的文件信息,内容似乎涉及了一本名为《中线CAD基础操作流程》的PDF文件。文件内容与CAD(计算机辅助设计)软件使用相关,可能包含了操作流程、步骤说明以及一些相关的CAD术语和概念。由于提供的内容片段包含...

    汽车线束设计软件及中线CAD应用简介 (1).pdf

    中线CAD在线束设计中的应用主要表现在以下几个方面: 2.1 原理图绘制 中线CAD在原理图绘制方面具备万能电器属性块定义功能和数据库电器模块参数化管理功能。这些功能可以快速定义电器及引脚属性,并通过自动连线...

    中线CAD使用步骤

    中线CAD使用步骤

    汽车线束设计软件及中线CAD应用简介.pdf

    本文将详细介绍汽车线束的发展历程,以及国内外汽车线束设计软件和中线CAD的应用情况。 在早期的汽车中,由于结构简单、机械控制占主导地位,线束的设计和制造相对简单,主要依赖手工进行连接和固定。但随着汽车...

    中线逐桩坐标计算原理PPT学习教案.pptx

    其中,Di表示桩点到HZ点的距离,XHZi-1和YHZi-1是HZi-1点的坐标,可以通过前一个交点JDi-1的坐标XJDi-1, YJDi-1和切线长THi-1来计算。而ZH点作为直线终点,其坐标计算可采用另一种公式,利用路线导线边长Si-1, i。 ...

    线路中线坐标

    二维数组可以有效地表示每个坐标的X和Y分量,使后续的数据处理更加方便。 #### 关键知识点分析 1. **坐标计算与数组设置**: - 在进行坐标计算时,通常需要处理多个点之间的关系,因此使用二维数组来存储坐标是...

    齿轮传动CAD开发中线图程序化处理方法.pdf

    在计算机辅助设计(CAD)技术应用中,齿轮传动设计是一个重要领域。在齿轮传动CAD开发过程中,线图是一种非常重要的设计参考。线图通常由一系列曲线构成,它们描述了齿轮在各种运行条件下的性能参数。在将这些线图...

    极坐标法测设线路中线圆曲线.ppt

    这种方法涉及到将坐标从一个系统转换到另一个,即从设计坐标系到施工坐标系。同样,也需要计算曲线要素和主点里程,然后通过一系列的数学运算得到每个桩点的坐标。 实际操作中,全站仪是实施极坐标法测设的重要工具...

    5800P计算机坐标正反算程序

    本文将详细介绍一个专门用于坐标正反算的程序,该程序主要应用于道路测量领域中的直线和圆曲线部分。通过本程序,可以实现从空间直角坐标(X,Y,F)到线路参数坐标(S,Z)以及从线路参数坐标到空间直角坐标的转换。 ...

    5800计算器全线坐标计算放样程序

    每个计算步骤都封装在一个标签(LB1)下,根据里程K的判断,程序跳转至相应的标签执行计算。在运行时,只需要加载对应的工程数据文件(如A匝道的"A"文件),即可自动完成整个计算过程。 5800计算器的这种编程模式...

    高速公路测量中线放样过程及方法

    - 一个标段内的附合导线数量取决于监理要求,应保证各施工单位之间的联接顺畅。 - 导线点坐标使用设计方给出的值还是复测后的值,应根据精度较高的一方选取,设计方应明确导线精度标准。 - 中桩放样可以结合导线点和...

Global site tag (gtag.js) - Google Analytics