Перейти к публикации

Рекомендованные сообщения



@alek77 Какое значение из :

lRetVal = swCustPropMgr.Get4("Наименование", False, Val, ValOut) 

Вы используете? Val или ValOut ?

Если смотреть пример из справки, то там переменная ValOut  называется ResolvedValOut , что наводит на мысли что это уже высчитанное значение свойства.

По крайней мере у меня код :

Скрытый текст



            ModelDoc2 swModel = swApp.ActiveDoc;
            CustomPropertyManager customPropertyManager = swModel.Extension.get_CustomPropertyManager("");
            customPropertyManager.Get4("Наименование", false, out string valOutF, out string resovedValOutF);
            Console.WriteLine($"Файл:");
            Console.WriteLine($"   OUT:    {valOutF}");
            Console.WriteLine($"   RESOLV: {resovedValOutF}");

            foreach (string configurationName in swModel.GetConfigurationNames())
            {

                // ****  ВАРИАНТ 1 ****
                //Configuration configuration = swModel.GetConfigurationByName(configurationName);
                //customPropertyManager = configuration.CustomPropertyManager;
                // ****  КОНЕЦ ВАРИАНТ 1 ****

                // ****  ВАРИАНТ 2 ****
                customPropertyManager = swModel.Extension.get_CustomPropertyManager(configurationName);
                // ****  КОНЕЦ ВАРИАНТ 2 ****

                customPropertyManager.Get4("Наименование", true, out string valOut, out string resovedValOut);

                Console.WriteLine($"Конф:  {configurationName}");
                Console.WriteLine($"   OUT:    {valOut}");
                Console.WriteLine($"   RESOLV: {resovedValOut}");
            }

 

работает как по варианту 1, та и по варианту 2. И, как видно, сами конфигурации я не активирую.

Т.е. у меня выводит в переменной (по вашему обозначению ) Val - $PRP:"SW-File Name" - $PRP:"SW-Configuration Name", а в переменной ValOut - прочитанные имя файла и имя конфигурации.

Изменено пользователем nicomed
Ссылка на сообщение
Поделиться на других сайтах
1 час назад, nicomed сказал:

Вы используете? Val или ValOut ?

Я использую ValOut , т.е. вычисленное значение. Но как оказалось, оно не обновляется автоматом. Огромная благодарность @v-david , как он написал выше, ShowConfiguration2 перед считыванием свойств все обновляет и считывание происходит корректно. Возможно у вас все работает так как язык другой, а вот в VBA не хочет. Спасибо, что откликнулись!

Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, nicomed сказал:

работает как по варианту 1, та и по варианту 2. И, как видно, сами конфигурации я не активирую.

Т.е. у меня выводит в переменной (по вашему обозначению ) Val - $PRP:"SW-File Name" - $PRP:"SW-Configuration Name", а в переменной ValOut - прочитанные имя файла и имя конфигурации.

У вас второй аргумент в функции UseCached = true. Следите за возвращаемым значением функции. Можно получить кэшированные данные, а не актуальные.

Изменено пользователем Shvg
Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Shvg сказал:

У вас второй аргумент в функции UseCached = true. Следите за возвращаемым значением функции. Можно получить кэшированные данные, а не актуальные.

Здесь грешен, был невнимателен. Баловался с параметрами и скопировал в браузер код с параметром TRUE.

Ссылка на сообщение
Поделиться на других сайтах
  • 2 недели спустя...

Коллеги, прошу помочь. Нужно получить координаты вершины компонента в пространстве листа чертежа.

Не могу победить матрицу трансформации (преобразования). А может и вообще все делаю не правильно.

На сколько я понимаю, есть пространство модели, при вставке вида в чертеж дополнительно появляются пространство чертежа и пространство вида. У всех пространств координаты не одинаковые, но связаны между собой через матрицу трансформации. Все верно?

Скрытый текст

'Получить координаты вершины компонента в пространстве листа чертежа:

Option Explicit

Sub main()

Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks

Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc

Dim swDraw As SldWorks.DrawingDoc
Set swDraw = swModel

Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swDraw.SelectionManager

swDraw.ClearSelection2 True

Dim swView As SldWorks.View
Set swView = swDraw.GetFirstView

Dim sheetView As SldWorks.View
Set sheetView = swView
Debug.Print "Имя листа - "; sheetView.Name

Set swView = swView.GetNextView
Debug.Print "Имя вида - "; swView.Name

Dim selData As SldWorks.SelectData
Set selData = swSelMgr.CreateSelectData
selData.View = swView

'Берем все виимые компоненты вида:
Dim vComps As Variant
vComps = swView.GetVisibleComponents

'Берем первый видимый компонент:
Dim Comp As SldWorks.Component2
Set Comp = vComps(0)

'Берем все видимые вершины:
Dim vVerts As Variant
vVerts = swView.GetVisibleEntities2(Comp, swViewEntityType_e.swViewEntityType_Vertex)

'Берем первую видмую вершину:
Dim startEnt As SldWorks.Vertex
Set startEnt = vVerts(0)

'Выделяем эту вершину (подсвечиваем):
Dim boolstatus As Boolean
boolstatus = startEnt.Select4(True, selData)
boolstatus = swDraw.GraphicsRedraw2

'Берем координаты этой вершины, не понятно вообще в пространстве чего:
Dim swVertexCoordinates As Variant
swVertexCoordinates = startEnt.GetPoint
Debug.Print "Координаты в пространстве (чего?) (X,Y,Z) - (" & swVertexCoordinates(0) * 1000 & ", " & swVertexCoordinates(1) * 1000 & ", " & swVertexCoordinates(2) * 1000 & ")"

'Дальше не понятные манипуляции для перевода координат в пространство листа:
Dim swMathUtil As SldWorks.MathUtility
Set swMathUtil = swApp.GetMathUtility

'Создаем математическую точку по координатам вершины:
Dim swMathPoint As SldWorks.MathPoint
Set swMathPoint = swMathUtil.CreatePoint(swVertexCoordinates)

'Создаем матрицу преобразования модели в вид:
Dim swViewXform As SldWorks.MathTransform
Set swViewXform = swView.ModelToViewTransform

'Создаем новую математическую точку по матрице преобразования:
Dim newMathPoint As SldWorks.MathPoint
Set newMathPoint = swMathPoint.MultiplyTransform(swViewXform)

'Выводим на печать координаты:
Debug.Print "Координаты в пространстве листа (X,Y,Z) - (" & newMathPoint.ArrayData(0) * 1000# & ", " & newMathPoint.ArrayData(1) * 1000# & ", " & newMathPoint.ArrayData(2) * 1000# & ")"

Debug.Print "Выполнено!"
End Sub

 

 

 

Как сделать так, чтобы этот код выводил координаты листа?

Ссылка на сообщение
Поделиться на других сайтах
17 часов назад, alek77 сказал:

На сколько я понимаю, есть пространство модели, при вставке вида в чертеж дополнительно появляются пространство чертежа и пространство вида. У всех пространств координаты не одинаковые, но связаны между собой через матрицу трансформации. Все верно?

Возможно заблуждаюсь, но, думается, пространство листа двухмерное (координата Z там тоже есть, для универсальности, но не используется и, так понима, всегда ноль), а пространство вида может быть в том числе трёхмерным (например, изометрический вид).

Так понимаю, что лист это тоже отдельный вид, но в который нельзя поместить модели (в совсем старых версиях всё что нужно было для листов помещалось в отдельный пустой вид, а потом программисты поколдовали и, так понимаю, сделали такой пустой встроенным для листа чертежа, что бы не морочить пользователю голову с дополнительными пустыми видами и для упрощения доступа к элементам листа). 

 

Искать координаты модели в пространсве листа думается странным и возможно не нужным, ведь виды это как отдельный листочек на общем чертеже - ведь не приходит в голову искать координаты второго листа через координаты на первом, а виды это своего рода маленькие листочки, расположенные на общем формате чертежа.

 

Думается надо искать нужный вид, при необходимости определить его координаты на листе, а потом просто работать в пространстве этого вида, не забыв выделить/заблокировать этот вид, что бы работа была именно в этом виде (а не соседнем, который налезает своим пространством на нужный).

 

Описали бы задачу. Что именно вы хотите получить? Для чего вы пытаетесь искать эти координаты?

 

Изменено пользователем Kelny
Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Kelny сказал:

Описали бы задачу

Я сделал макрос для простановки габаритных размеров каждого вида на чертеже. Но при этом мои вычисления координат не корректные, не в пространстве листа. Для определения макимумов и минимумов вида нужно это делать на листе. Если для детали все прокатывает, то для сборочной единицы, где у каждой детали свои ситемы координат - не прокатывает, и нужно переводить их в координаты листа.

 

Если посмотреть макрос из справки - Dimension Edge In Drawing Example, там как раз все корректно переводится и координаты выдаются в пространстве листа один в один. Но принцип выбора кромки из модели, потом все транслируется в чертеж. У меня же логика немного другая, у меня чертеж с видами уже есть и выбор происходит в чертеже, вот тут и начинается свистопляска с пространствами и координатами.

 

Если кто уже разбирался в этой теме - прошу подсказать.

Ссылка на сообщение
Поделиться на других сайтах

  

6 часов назад, alek77 сказал:

Если кто уже разбирался в этой теме - прошу подсказать.

Не подскажу.

Изменено пользователем Kelny
Ссылка на сообщение
Поделиться на других сайтах

По этой теме есть хорошая статья:

https://cadbooster.com/complete-overview-of-matrix-transformations-in-the-solidworks-api/

У Артема есть несколько примеров.

Но

Все примеры у меня не работают, т.е. работают, но при пристальном взгляде везде есть ошибка.

Или в примерах никто не углублялся до вывода полученных координат на экран и проверки. Да ну на, не может быть.

Если полученные координаты не смотреть, то и у меня мой изначальный макрос работает, и ошибок нет.

А если смотреть, то координаты не верные.

Если у кого есть возможность, проверьте работу макроса от Артема:

https://www.codestack.net/solidworks-api/document/drawing/sheet-context-sketch/

У меня выдает следующий результат:

image.png

И я думаю, что это у меня в системе что-то сбито, а что - нужно понять.

Такая же ерунда со смещенными координатами у любых макросов с трансформацией, кроме макроса из справки SW, Dimension Edge In Drawing Example. Там все отлично.

 

 

Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, alek77 сказал:

Если кто уже разбирался в этой теме - прошу подсказать.

Пробовал (хотел "накостылить" разрыв линии), но получалась, примерно, такая ерунда, как и у Вас. Брал примеры и с офф сайта, и с сайта Артема.

Ссылка на сообщение
Поделиться на других сайтах

@alek77  У меня норм, просто надо соблюсти условия: 1) масштаб вида 1:1 2) масштаб листа 2:1 почему такие условия хз.

Om2xFxl.jpeg

Ссылка на сообщение
Поделиться на других сайтах
03.05.2024 в 11:43, alek77 сказал:

Если кто уже разбирался в этой теме - прошу подсказать.

Поднял старые записи. Из того что было максимально похоже на то, что можно было назвать "получалось" :

Скрытый текст

            ModelDoc2 modelDoc = swApp.ActiveDoc;
            DrawingDoc drawing = modelDoc as DrawingDoc;

            MathUtility mathUtils = swApp.IGetMathUtility();

            SelectionMgr selectionMgr = modelDoc.SelectionManager;
            Edge edge = selectionMgr.GetSelectedObject6(1,-1);

            View view = selectionMgr.GetSelectedObjectsDrawingView2(1, 0);

            //Не уверен - надо ли ...
            drawing.ActivateView(view.Name); 

            double[] viewpositionArray = view.Position;
            // Здесь по идее можно и просто получить координаты вершины выбранного EDGE
            var curveParams = edge.GetCurveParams2();
            var startPoint = new double[3];
            startPoint[0] = curveParams[0];
            startPoint[1] = curveParams[1];
            startPoint[2] = curveParams[2];

            MathPoint modelPoint =mathUtils.CreatePoint(startPoint);

            MathTransform modelTransform = view.ModelToViewTransform;

            MathPoint drawingPoint = modelPoint.MultiplyTransform(modelTransform);
            double[] drawingPointArray = drawingPoint.ArrayData;

            SketchManager sketchManager = modelDoc.SketchManager;
            // Первые три координаты даны для простоты тестирования
            sketchManager.CreateLine(
               0, 0, 0,
               (drawingPointArray[0] - viewpositionArray[0]) / modelTransform.ArrayData[12],
               (drawingPointArray[1] - viewpositionArray[1]) / modelTransform.ArrayData[12],
               drawingPointArray[2] / modelTransform.ArrayData[12]);

 

 

Самому не совсем понятно поведение СкетчМенеджера при отрисовке линии от координат 0,0,0 - частенько слетает в произвольное место на виде. 

Изменено пользователем nicomed
Ссылка на сообщение
Поделиться на других сайтах

@alek77 Если еще интересно, то вот код, который рисует два сегмента эскиза поверх выбранной кромки. Первый сегмент от начальной точки кромки до точки выбора, второй сегмент - от конечной точки выбранной кромки до точки выбора.

При этом учитывается:

  • положение компонента в сборке;
  • поворот чертежного вида относительно пространства модели.

Код как обычно - лишь бы работало - все в одном методе.

Скрытый текст



        // Выбранную кромку получаем как аргумент функции
        void EdgeTrim(Edge edge)
        {
            if (IsLine(edge))
            {
              Console.WriteLine("Выбрана линейная кромка");
              ModelDoc2 modelDoc = swApp.ActiveDoc;
              ModelDocExtension modelDocExtension = modelDoc.Extension;
              DrawingDoc drawing = modelDoc as DrawingDoc;              
              SelectionMgr selectionMgr = modelDoc.SelectionManager;
              MathUtility mathUtils = swApp.GetMathUtility();
              View selectedView = selectionMgr.GetSelectedObjectsDrawingView2(1, -1);
              // Матрица поворота чертежного вида относительно простанства модели корневой сборки (детали)
              MathTransform modelTransform = selectedView.ModelToViewTransform;
              Entity selectedEntity = (Entity)edge;
              // Получаем комонент, которомы принадлежит выбранная кромка
              Component2 selComponent = selectedEntity.GetComponent();
              // Матрица поворота детали (посборки) в пространстве корневой сборки
              MathTransform compTransform = selComponent.Transform2;

              double[] viewPosition = selectedView.Position;
              double[] selectionPoint = selectionMgr.GetSelectionPoint2(1, -1);
              
              double[] startPoint = edge.GetStartVertex().GetPoint();
			  // Создаем мат.точку по "родным" координатам выбранной кромки              
              MathPoint modelStartPoint = mathUtils.CreatePoint(startPoint);
              // Учет расположения детали (подсборки) в простанстве корневой сборки
              modelStartPoint = modelStartPoint.MultiplyTransform(compTransform);
              // получаем положение мат.точки в простанстве чертежа
              MathPoint drawingStartPoint = modelStartPoint.MultiplyTransform(modelTransform);
              
              double[] endPoint = edge.GetEndVertex().GetPoint();
              MathPoint modelEndPoint = mathUtils.CreatePoint(endPoint);
              modelEndPoint = modelEndPoint.MultiplyTransform(compTransform);
              MathPoint drawingEndPoint = modelEndPoint.MultiplyTransform(modelTransform);

              double[] drawingStartPointArray = drawingStartPoint.ArrayData;
              double[] drawingEndPointArray = drawingEndPoint.ArrayData;
              // Рисование сегментов эскиза от крайних точек выбранной кромки до точки выбора
              SketchManager sketchManager = modelDoc.SketchManager;
              SketchSegment startSegment = sketchManager.CreateLine(
                (drawingStartPointArray[0] - viewPosition[0]) / modelTransform.ArrayData[12],
                (drawingStartPointArray[1] - viewPosition[1]) / modelTransform.ArrayData[12],
                drawingStartPointArray[2] / modelTransform.ArrayData[12],
                (selectionPoint[0] - viewPosition[0]) / modelTransform.ArrayData[12],
                (selectionPoint[1] - viewPosition[1]) / modelTransform.ArrayData[12],
                selectionPoint[2] / modelTransform.ArrayData[12]
              );
              SketchSegment endSegment = sketchManager.CreateLine(
                (drawingEndPointArray[0] - viewPosition[0]) / modelTransform.ArrayData[12],
                (drawingEndPointArray[1] - viewPosition[1]) / modelTransform.ArrayData[12],
                drawingEndPointArray[2] / modelTransform.ArrayData[12],
                (selectionPoint[0] - viewPosition[0]) / modelTransform.ArrayData[12],
                (selectionPoint[1] - viewPosition[1]) / modelTransform.ArrayData[12],
                selectionPoint[2] / modelTransform.ArrayData[12]
              );
            }
            else if (IsCircle(edge))
            {
                Console.WriteLine("Выбрана кромка окружность");
            }
        }


        bool IsLine(Edge edge)
        {
          return edge.GetCurve().IsLine();
        }

        bool IsCircle(Edge edge)
        {
          return edge.GetCurve().IsCircle();
        }

 

 

Вот что не пробовал, так это многоуровневые сборки. Боюсь что бы не приходилось делать  пересчет положения выбранного компонента столько раз, на каком уровне вложения находится выбранный компонент.

 

Upd: Нашел глюк (точнее свою недоработку с которой еще предстоит разбираться) - если вид с разрывом - то точка выбора смещается ...

Изменено пользователем nicomed
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...