Jump to content

Recommended Posts



nicomed

@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 - прочитанные имя файла и имя конфигурации.

Edited by nicomed
  • Нравится 1
Link to post
Share on other sites
alek77
1 час назад, nicomed сказал:

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

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

Link to post
Share on other sites
Shvg
2 часа назад, nicomed сказал:

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

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

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

Edited by Shvg
Link to post
Share on other sites
nicomed
1 час назад, Shvg сказал:

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

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

Link to post
Share on other sites
  • 2 weeks later...
alek77

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

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

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

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

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

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

 

 

 

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

Link to post
Share on other sites
Kelny
17 часов назад, alek77 сказал:

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

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

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

 

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

 

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

 

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

 

Edited by Kelny
Link to post
Share on other sites
alek77
2 часа назад, Kelny сказал:

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

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

 

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

 

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

Link to post
Share on other sites
Kelny

  

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

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

Не подскажу.

Edited by Kelny
Link to post
Share on other sites
alek77

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

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. Там все отлично.

 

 

Link to post
Share on other sites
nicomed
8 часов назад, alek77 сказал:

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

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

  • Нравится 1
Link to post
Share on other sites
Snake 60

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

Om2xFxl.jpeg

  • Чемпион 1
Link to post
Share on other sites
nicomed
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 - частенько слетает в произвольное место на виде. 

Edited by nicomed
  • Нравится 1
Link to post
Share on other sites
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: Нашел глюк (точнее свою недоработку с которой еще предстоит разбираться) - если вид с разрывом - то точка выбора смещается ...

Edited by nicomed
  • Чемпион 1
Link to post
Share on other sites
  • 3 weeks later...
Sla_68

Добрый день. Подскажите. Как заставить солид API не выдавать системное сообщение при исполнении кода. Код импортирует тела графики в модель формата STL. Иногда появляются сообщения "Эта модель сетки может быть импортирована только как тело поверхности, а не как твердое тело" . Нажимаю OK и код продолжает свою работу. Но мне надо что бы предупреждение не появлялось.

Link to post
Share on other sites
malvi.dp
34 минуты назад, Sla_68 сказал:

Добрый день. Подскажите. Как заставить солид API не выдавать системное сообщение при исполнении кода. Код импортирует тела графики в модель формата STL. Иногда появляются сообщения "Эта модель сетки может быть импортирована только как тело поверхности, а не как твердое тело" . Нажимаю OK и код продолжает свою работу. Но мне надо что бы предупреждение не появлялось.

Нужен этот код, чтобы попытаться поправить его под ваши нужды.

Edited by malvi.dp
Link to post
Share on other sites
Sla_68
57 минут назад, malvi.dp сказал:

Нужен этот код, чтобы попытаться поправить его под ваши нужды.

прикрепил код и тестовые парочку файлов:

https://disk.yandex.ru/d/qvXEf70WyKk6eA

Link to post
Share on other sites
malvi.dp
10 часов назад, Sla_68 сказал:

прикрепил код и тестовые парочку файлов:

К сожалению не могу скачать с Яндекс диска, выложите на Гугл диске или здесь.

Link to post
Share on other sites
Kelny
14 часов назад, malvi.dp сказал:

Нужен этот код, чтобы попытаться поправить его под ваши нужды.

Цитата

Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swImportData As SldWorks.ImportIgesData
    Dim Err As Long

    Set swApp = CreateObject("SldWorks.Application")
    Set swModel = swApp.LoadFile4("C:\Users\sss\Desktop\2.stl", "r", swImportData, Err)

    Debug.Print ("Error (0 = no error): " & Err)
End Sub

 

  • Нравится 1
Link to post
Share on other sites
malvi.dp

@Kelny, будьте добры тогда и файлики ТС, чтоб воспроизвести этот диалог. Спасибо.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.



  • Сообщения

    • Guhl
      Что значит в состоянии разгона? То есть в разнос уходит? Вот когда один ключ не работает, то будет ситуация, что мотор не может достичь заданной скорости и растет нагрузка
    • Guhl
      Я открывал его, выглядит судя по фоткам в инете как оригинал. Микросхемы, плата Чтобы образ снять и пароль вытянуть
    • gudstartup
      Ключи здесь ни причем просто усилитель находится в режиме постоянного разгона до заданной скорости а достичь ее е может   отсюда и нагрузка в 150%
    • gudstartup
      А для чего он нужен например в 828D? цена оригинала выше в 10 раз а у нас не было случаев чтобы  не подключился просто у оригиналов скорость обмена может быть более 1.5 МБит и если связь в контроллере настроена на более высокую скорость то может и не соединиться  тоже игрушка для толстосумов да и зачем она если можно в проц. воткнуть и прочитать?
    • Maker79
      Мне будет очень интересно!
    • maxx2000
      @Maker79 именно так. Не нравится делать всю работу за программу, обрабатывай 3D модель. Есть другие хорошие CAM которые умеют накладывать плоский шаблон на любую криволинейную поверхность 
    • Maker79
      Следуя этому смыслу нужно создать шаблон учитывая диаметр фрезы и смещение, то-есть сделать всю работу за программу и положить ей в рот чтобы она прожевала? 
    • Viktor2004
      Щас как-то нет времени вникать в эту тему. Может тут проблема как у меня когда-то была?   вот еще    
    • Guhl
      Ну меня настрощали, что не всегда удается подключиться. Может конечно это и неправда, но с оригиналом всегда спокойнее. ММС читаются обычным внешним программатором  А вот для MC карт (или как там они называются) есть сименсовский ридер  
    • boomeeeer
      я китайским за 3к без проблем цепляюсь к этой ЧПУхе
×
×
  • Create New...