| 这是一个vba程序,允许沿pline插入块。它基本上可以满足您的需要,但需要修改以满足您的块长度需要。我将代码作为源代码发布,它基本上需要2个点,并使用intersectwith来计算块角度。我们用它来检查车辆的车道。 
 
 Sub draw_vehicle()Dim CAR As StringDim arcobj As AcadArcDim oPoly As AcadEntityDim blkobj As AcadEntityDim retVal As VariantDim snapPt As VariantDim oCoords As VariantDim blpnt1() As VariantReDim blpnt1(100)Dim blpnt2() As VariantReDim blpnt2(100)Dim vertPt(0 To 2) As DoubleDim Pt1(0 To 2) As DoubleDim Pt2(0 To 2) As DoubleDim newPt(0 To 2) As DoubleDim iCnt, w, x, y, z As IntegerDim cRad, interval, blkangle As DoubleDim circObj As AcadCircleDim lineObj As AcadLineOn Error GoTo Something_WrongIf ThisDrawing.ActiveSpace = acModelSpace ThenSet Thisspace = ThisDrawing.ModelSpaceElse: Set Thisspace = ThisDrawing.PaperSpaceEnd IfFor Each Item In ThisDrawing.BlocksIf Item.Name = "holden" Then GoTo continue_onNext Item' insert holden blockInsertBlock "p:\Autodesk\vba\holdencar.dwg", 0continue_on:w = 1ThisDrawing.Utility.GetEntity oPoly, snapPt, vbCr & "Select polyline :"If oPoly.ObjectName = "AcDbPolyline" ThenoCoords = oPoly.CoordinatesElse: MsgBox "This object is not a polyline! Please do again"Exit SubEnd Ifinterval = CDbl(InputBox("Enter interval:", , 1#))If interval < 1 Theninterval = 1End IfFor iCnt = 0 To UBound(oCoords) - 2 Step 2Pt1(0) = oCoords(iCnt): Pt1(1) = oCoords(iCnt + 1): Pt1(2) = 0#newPt(0) = Pt1(0)newPt(1) = Pt1(1)newPt(2) = 0#iCnt = iCnt + 2Pt2(0) = oCoords(iCnt): Pt2(1) = oCoords(iCnt + 1): Pt2(2) = 0#x = (Pt1(0) - Pt2(0)) / intervaly = (Pt1(1) - Pt2(1)) / interval'reset back 2 valuesiCnt = iCnt - 2cRad = 3.05startang = 4.71239endang = 1.570796CAR = "HOLDEN"For z = 1 To intervalvertPt(0) = newPt(0) - xvertPt(1) = newPt(1) - yvertPt(2) = 0#'blpnt1(w) = vertPt'Set arcobj = ThisDrawing.ModelSpace.AddArc(vertPt, cRad, endang, startang)Set arcobj = Thisspace.AddArc(vertPt, cRad, endang, startang)retval2 = arcobj.IntersectWith(oPoly, acExtendOtherEntity)arcobj.DeleteSet arcobj = Nothingblkangle = ThisDrawing.Utility.AngleFromXAxis(retval2, vertPt)'Set blkobj = ThisDrawing.ModelSpace.InsertBlock(vertPt, CAR, 1#, 1#, 1#, blkangle)Set blkobj = Thisspace.InsertBlock(vertPt, CAR, 1#, 1#, 1#, blkangle)Set blkobj = Nothingw = w + 1newPt(0) = newPt(0) - xnewPt(1) = newPt(1) - yNext zNext iCntGoTo Exit_outSomething_Wrong:MsgBox Err.DescriptionExit_out:End Sub   Function InsertBlock(ByVal blockpath As String, ByVal rotation As Double)   Dim blockobj As AcadBlockReference   Dim insertionPnt As Variant   Dim prompt1 As String   'set rotation Angle   rotateAngle = rotation   'rotateAngle = rotation * 3.141592 / 180#   'Prompt is used to show instructions in the command bar   prompt1 = vbCrLf & "Enter block insert point: "    'ThisDrawing.ActiveSpace = acModelSpace    insertionPnt = ThisDrawing.Utility.GetPoint(, prompt1)   Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, blockpath, 1#, 1#, 1#, rotateAngle)   'Change Modelspace into Paperspace to insert the block into Paperspace    End Function
 |