SLW210 发表于 2022-7-6 22:34:10

 
您已经在AutoLISP、Visual LISP和DCL论坛上发布了此线程。
 
我已将您的线程移动到。NET、ObjectARX和VBA论坛。

RICVBA 发表于 2022-7-6 22:36:40

这是一个可能的代码
 
Option Explicit

Sub ListIntersectingLines()
   Dim linesSset As AcadSelectionSet
   Dim nIntersectingLines As Long
   Dim mainLine As AcadLine, acLine As AcadLine
   
   Set mainLine = GetALine
   
   If Not GetPossiblyCrossingLines(linesSset, mainLine) Then
       MsgBox "no possible intersecting lines with main line"
       Exit Sub
   End If
   
   If FilterActuallyIntersectingLines(linesSset, mainLine) Then
       For Each acLine In linesSset
         nIntersectingLines = nIntersectingLines + 1
         MsgBox "Intersecting line #" & nIntersectingLines & " ID=" & acLine.ObjectID
         acLine.color = acGreen
       Next
   Else
       MsgBox "no intersecting lines with main line"
   End If
End Sub

Function FilterActuallyIntersectingLines(linesSset As AcadSelectionSet, mainLine As AcadLine) As Boolean
   Dim nLines As Long
   Dim acLine As AcadLine
   Dim removeObjectsCounter As Long      
   ReDim removeObjects(0 To linesSset.Count - 1) As AcadEntity

   With mainLine
       For Each acLine In linesSset
         If UBound(.IntersectWith(acLine, acExtendNone)) = -1 Then
               Set removeObjects(removeObjectsCounter) = acLine
               removeObjectsCounter = removeObjectsCounter + 1
         End If
       Next
       If removeObjectsCounter > 0 Then
         ReDim Preserve removeObjects(0 To removeObjectsCounter - 1) As AcadEntity
         linesSset.RemoveItems removeObjects
         FilterActuallyIntersectingLines= linesSset.Count > 0
       End If
   End With
End Function

Function GetALine() As AcadLine
   Dim basePnt As Variant
   
   On Error Resume Next
   Do While GetALine Is Nothing
       ThisDrawing.Utility.GetEntity GetALine, basePnt, "Select a line"
   Loop
End Function

Function GetPossiblyCrossingLines(linesSset As AcadSelectionSet, mainLine As AcadLine) As Boolean
   Dim gpCode(0) As Integer
   Dim dataValue(0) As Variant
   
   gpCode(0) = 0
   dataValue(0) = "LINE"
   On Error Resume Next
   Set linesSset = ThisDrawing.SelectionSets.Add("Lines")
   On Error GoTo 0
   If linesSset Is Nothing Then Set linesSset = ThisDrawing.SelectionSets.Item("Lines")
   
   Dim corner1 As Variant, corner2 As Variant
   mainLine.GetBoundingBox corner1, corner2
   ZoomWindow corner1, corner2
   With linesSset
       .Clear
       .Select acSelectionSetCrossing, corner1, corner2, gpCode, dataValue
       If .Count > 1 Then
         Dim removeObjects(0 To 0) As AcadEntity
         Set removeObjects(0) = mainLine
         .RemoveItems removeObjects
         GetPossiblyCrossingLines= True
       End If
   End With
   ZoomPrevious
End Function

BIGAL 发表于 2022-7-6 22:45:07

Lisp版本中,请注意,当拾取线作为选择集中的最后一个对象返回时,会出现鬼鬼祟祟的x-1,这比执行微妙的偏移和拾取点更容易。
 

; example of intersect with by Alan H Aug 2017
; to use on pline same code but need fence option to use co-ords
; need to add this option see pline co-ords code

(defun c:ByBIGAL ( / obj obj2 lst ss pt ans)
(setq obj (vlax-ename->vla-object (car (entsel "\nPick object"))))
(if (= "AcDbLine" (vla-get-objectname obj))
(progn
(setq lst (list
(vlax-safearray->list (vlax-variant-value(vla-get-startpoint obj)))
(vlax-safearray->list (vlax-variant-value(vla-get-endpoint obj)))
))
(setq ans "")
(setq ss (ssget "F" lst (list (cons 0 "Line"))))
(repeat (setq x (- (sslength ss)1))
(setq obj2 (vlax-ename->vla-object (ssname ss (setq x (- x 1)))))
(setq pt (vlax-invoke obj2 'intersectWith obj acExtendThisEntity))
(setq ans (strcat ans "\nX=" (rtos (car pt) 2 3) " " "Y= " (rtos (cadr pt) 2 3) ))
)
)
(alert "Object picked is not a line")
)
(alert ans)c
(princ)
)

ursan 发表于 2022-7-6 22:49:19

 
谢谢你的回复。当我更改custom corner1和corner2完美工作程序时。
但当两条线背靠背时,它不起作用。我添加了示例图片。line1和line2是两条交错的线。运行程序后,line1颜色再次为白色。命令行1将检测什么?

RICVBA 发表于 2022-7-6 22:49:35

这是因为重叠的线条不会
方法捕捉任何交点
 
您可以通过尝试查看与主线段平行的任何线段是否也在许多方面重叠(因此相交)来处理此异常
 
以下是其中之一(仅显示更改的子/函数):
 
函数FilterActuallyIntersectingLines(linesSset为AcadSelectionSet,mainLine为AcadLine)作为布尔Dim acLine作为AcadLine Dim removeObjects输入只要ReDim removeObjects(0到linesSset。Count-1)作为linesSset中每个acLine的mainLine的身份如果没有doestintersect(mainLine,acLine),则“0”,然后ReDim Preserve removeObjects(0以删除ObjectsCenter-1)作为身份线集。如果以FilterActuallyIntersectingLines=LinesSet结尾,则RemoveItems removeObjects结束。计数>0’
页: 1 [2]
查看完整版本: 交叉线列表