Есть ли альтернатива View.GetOutline (), которая дает лучшую схему? - PullRequest
1 голос
/ 29 октября 2019

Схема, возвращаемая методом View.GetOutline(), не совсем соответствует видимому чертежу - она ​​возвращает немного больше, чем схема выбора, показанная в графическом интерфейсе SolidWorks.

На снимке экрана ниже показан контур выделения (светло-голубой пунктирный прямоугольник) и диагональ контура, возвращенная View.GetOutline() (красная линия):

enter image description here

Есть ли способ получить ограничивающую рамку, которая соответствует фактически видимому рисунку?

Примечание: Первоначальное название этого вопроса было«Есть ли альтернатива View.GetOutline (), которая НЕ включает Временные оси?», Однако я обнаружил, что View.GetOutline() на самом деле не включает Временные оси. Проблема была в свойстве View.Position, которое определяет ограничивающий прямоугольник, который включает Временные оси .
Ответ Артема был весьма полезен, поэтому я решил изменить вопрос, чтобы он соответствовалответьте и напишите новый вопрос для актуальной проблемы.

1 Ответ

2 голосов
/ 29 октября 2019

Вы можете получить ограничивающий прямоугольник из базовой модели через API IPartDoc :: GetBox / IAssemblyDoc :: GetBox и преобразовать его в пространство просмотра через IView :: ModelToViewTransform, как показано в в этом примере .

Вам понадобится только следующая часть кода из функции DrawBBoxDiagonal, если вы не хотите рисовать диагональ. Значения vStartPt и vEndPt являются конечными точками ограничительной рамки.

Dim vBox As Variant
Dim swViewTransform As SldWorks.MathTransform

Dim swMathPt As SldWorks.MathPoint
Dim vStartPt As Variant
Dim vEndPt As Variant

vBox = GetViewRefModelBBox(view)
Set swViewTransform = GetViewToSheetTransform(draw, view)

Dim swMathUtils As SldWorks.MathUtility
Set swMathUtils = swApp.GetMathUtility

Dim dPt(2) As Double
dPt(0) = vBox(0): dPt(1) = vBox(1): dPt(2) = vBox(2)

Set swMathPt = swMathUtils.CreatePoint(dPt)
Set swMathPt = swMathPt.MultiplyTransform(swViewTransform)
vStartPt = swMathPt.ArrayData

dPt(0) = vBox(3): dPt(1) = vBox(4): dPt(2) = vBox(5)

Set swMathPt = swMathUtils.CreatePoint(dPt)
Set swMathPt = swMathPt.MultiplyTransform(swViewTransform)
vEndPt = swMathPt.ArrayData

Я также рекомендовал бы получить точную ограничительную рамку через IBody2 :: GetExtremePoint, как показано здесь

...