026集—CAD中多段线批量增加折点(相交点)——vba代码实现

当需要批量在多段线中加入顶点(与多段线相交的点)时,如下图所示:若干条线相交:

我们想在相交处增加折点,可通过vba插件一键完成。

(使用方法命令行输入:vbaman,加载插件,vbarun,运行插件即可。)

 

 同时,本插件支持闭合图形增加相交点为顶点:

当多次执行此程序,多段线不会增加大量重复相交点,避免产生大量距离过近的点、重复点。

另附部分源代码可供参考:

Sub AddIntersectionPointsToMultiplePolylines()
    ' yngqq443440204@2024年8月25日10:41:30
    On Error Resume Next
    Dim polyline1 As AcadLWPolyline ' 用于存储第一批中的单个多段线
    Dim polyline2 As AcadLWPolyline ' 用于存储第二批中的单个多段线
    Dim intersectPoints As Variant ' 用于存储交点
    Dim newVertices() As Double ' 用于存储新的顶点
    Dim oldVertices As Variant ' 用于存储原有的顶点
    Dim selSet1 As AcadSelectionSet ' 第一批多段线的选择集
    Dim selSet2 As AcadSelectionSet ' 第二批多段线的选择集
    Dim i As Integer, j As Integer, k As Integer
    Dim vertexCount As Integer
    Dim vertexinserted As Boolean
    ' 删除已有的选择集,避免冲突

    On Error Resume Next
    ThisDrawing.SelectionSets.Item("selSet1").Delete
    ThisDrawing.SelectionSets.Item("selSet2").Delete
    On Error GoTo 0
    Set selSet1 = ThisDrawing.SelectionSets.Add("selSet1")
    Set selSet2 = ThisDrawing.SelectionSets.Add("selSet2")
    ThisDrawing.Utility.Prompt "请选择第一批需要加点的线,并按空格键结束。"
    selSet1.SelectOnScreen
    If selSet1.Count = 0 Then GoTo erro
       If selSet1.Count = 0 Then GoTo erro
    ' 提示用户选择第二批多段线
    ThisDrawing.Utility.Prompt "请选择第二批线,并按空格键结束。"
    selSet2.SelectOnScreen
    ' 遍历第一批多段线
    For i = 0 To selSet1.Count - 1
        ' 获取当前第一批多段线
        Set polyline1 = selSet1.Item(i)
        'Call SimplifyPolyline(polyline1)

        ' 初始化一个新数组用于存储当前多段线的所有顶点
        oldVertices = polyline1.Coordinates
        vertexCount = UBound(oldVertices) + 1
        ' 遍历第二批多段线
        For j = 0 To selSet2.Count - 1
            ' 获取当前第二批多段线
            Set polyline2 = selSet2.Item(j)
            ' 查找交点
            intersectPoints = polyline1.IntersectWith(polyline2, acExtendNone)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''
''''省略部分源码,qq完整代码443440204

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Next j

    Next i

    ThisDrawing.Utility.Prompt "交点已加入到第一批多段线中。"
erro:
    MsgBox "OK,CAD二次开发", , "443440204"
End Sub

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 PostGIS 提供的 ST_Node 函数来实现该功能。该函数接受一个几何图形作为参数,返回该图形中所有节合,包括顶相交。然后,您可以使用 ST_Split 函数将线图层按照相交进行拆分,并将结果存储在新的图层中。 具体实现步骤如下: 1. 首先,您需要创建一个包含多个线图层的数据库表,例如: ```sql CREATE TABLE multilines ( id serial primary key, geom geometry(multiLineString, 4326) ); ``` 2. 然后,您可以使用 ST_Node 函数查找所有节。请注意,您需要使用 ST_Dump 函数将多线几何图形拆分成单线几何图形才能对每条线分别查找节。 例如: ```sql SELECT (ST_Dump(ST_Node(geom))).geom AS node_geom FROM multilines; ``` 3. 接下来,您可以使用 ST_Split 函数将线图层按照相交进行拆分,并将结果存储在新的图层中。请注意,您需要使用 ST_Collect 函数将拆分后的线段重新组合成多线几何图形。 例如: ```sql CREATE TABLE split_lines AS SELECT ST_Collect(ST_Split(multilines.geom, nodes.node_geom)) AS geom FROM multilines, (SELECT (ST_Dump(ST_Node(geom))).geom AS node_geom FROM multilines) AS nodes WHERE ST_Intersects(multilines.geom, nodes.node_geom) GROUP BY multilines.id; ``` 在上述 SQL 查询中,我们首先使用 ST_Dump 函数将节几何图形拆分成单个几何图形,然后将其存储在名为 nodes 的临时表中。然后,我们使用 ST_Split 函数将每个线图层按照节进行拆分,并使用 ST_Collect 函数将结果组合成多线几何图形。最后,我们使用 ST_Intersects 函数过滤掉不相交的线段,并使用 GROUP BY 子句按照线图层 ID 进行分组。 注意:在执行此操作之前,请确保您已经安装了 PostGIS 扩展,并且您的数据库中已经加载了正确的几何类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值