Private Sub EventOnEditorSelectCurves(ByVal Sender As Object,
ByVal acResultArgs As PromptForEntityEndingEventArgs)
'' Объявление внутренних постоянных
Const msg_Correct_Object_Required = "Выбран неверный объект или неверная точка указания объекта." & vbCrLf &
"Необходимо выбрать отрезок или линейный сегмент плоской полилинии." & vbCrLf &
"Выбранный объект должен иметь ненулевую длину."
'' Объявление внутренних переменных
Dim acEditor As Editor = CType(Sender, Editor)
Dim acSelObjId As ObjectId = acResultArgs.Result.ObjectId
Dim acSelObjPnt As Point3d = acResultArgs.Result.PickedPoint
Dim acAllowObject As Boolean = (acSelObjId <> Nothing)
If Not acAllowObject Then Return
'' Конвертируем точку примитиво-указания
acSelObjPnt = ConvertPoint(acEditor, acSelObjPnt)
'' Проверка типа объекта:
'' допустимые объекты: Line, Polyline, Polyline2d
Dim acValidTypes() As Type = {GetType(Line), GetType(Polyline), GetType(Polyline2d), GetType(Polyline3d)}
acAllowObject = CheckTypes(acSelObjId, acValidTypes)
If Not acAllowObject Then GoTo lexit
'' Старт транзакции для работы с объектами чертежа
Using acTrans As Transaction =
acSelObjId.Database.TransactionManager.StartTransaction()
'' Получение примитива по его ObjectId как CURVE
Dim acEntity As Entity = acTrans.GetObject(acSelObjId, OpenMode.ForRead)
Dim acCurve As Curve = CType(acEntity, Curve)
'' Оценка свойств примитива как CURVE ...
'' ... вычисление длины кривой в целом:
'' кривая из одного сегмента должна быть ненулевой длины
Dim acDist_1 = acCurve.GetDistanceAtParameter(acCurve.StartParam)
Dim acDist_2 = acCurve.GetDistanceAtParameter(acCurve.EndParam)
acAllowObject = (acDist_2 - acDist_1) > 0
If Not acAllowObject Then GoTo lexit
'' ... кривая не должна быть замкнутой:
'' замкнутые кривые /именно по свойству CLOSED/ не подходят по условию задачи
acAllowObject = Not acCurve.Closed
If Not acAllowObject Then GoTo lexit
'' ... вычисление номера выделенного сегмента
Dim acViewVector As Vector3d = GetViewDirection(acEditor)
Dim acPointOnCurve As Point3d = acCurve.GetClosestPointTo(acSelObjPnt, acViewVector, False)
Dim acSegmentStart As Double = GetCurveSegmentStart(acCurve, acPointOnCurve)
Dim acSegmentEnd As Double = GetCurveSegmentEnd(acCurve, acPointOnCurve)
acAllowObject = acSegmentEnd > acSegmentStart
If Not acAllowObject Then GoTo lexit
'' ... вычисление длины кривой на участке выделенного сегмента:
'' длина кривой на выделенном сегменте не должна быть нулевой
Dim acStartDist As Double = acCurve.GetDistanceAtParameter(acSegmentStart)
Dim acEndDist As Double = acCurve.GetDistanceAtParameter(acSegmentEnd)
Dim acCurveLength = acEndDist - acStartDist
acAllowObject = acCurveLength > 0
If Not acAllowObject Then GoTo lexit
'' ... вычисление расстояния от начальной точки сегмента до конечной:
'' по условиям выбранный сегмент должен быть отрезком
'' /длина вдоль сегмента равна расстоянию между его концами/
Dim acStartPoint As Point3d = acCurve.GetPointAtParameter(acSegmentStart)
Dim acEndPoint As Point3d = acCurve.GetPointAtParameter(acSegmentEnd)
Dim acChordLength As Double = acStartPoint.DistanceTo(acEndPoint)
acAllowObject = (acCurveLength - acChordLength) <= Tolerance.Global.EqualPoint
If Not acAllowObject Then GoTo lexit
acTrans.Commit()
End Using
'' Если объект удовлетворяет всем условиям - выход из функции
Return
lexit: '' Если оценка отрицательная объекта - удаляем примитив из выбора
acResultArgs.RemoveSelectedObject()
EditorMsg(acEditor, msg_Correct_Object_Required)
End Sub