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

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



@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
Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...

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

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

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

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

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

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

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

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

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

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

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

Ссылка на сообщение
Поделиться на других сайтах
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

 

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

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

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

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

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

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

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

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

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

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

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

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

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




  • Сообщения

    • Клиент
      Это какая то секретная версия для секретных работ: https://en.wikipedia.org/wiki/Mastercam
    • Борман
      Максимально абстрактная формулировка...   Есть нагрузка в виде переменного воздействия "Э" (условно переменное напряжение), есть исследуемая механическая система ("МС"), которая восприимчива к обычному механическому воздействию. Между "Э" и "МС" есть электро-механическая система "ЭМС", на которую можно воздействовать напряжением и которая будет откликаться перемещением.   Ну т.е. логика такова: Э -> ЭМС -> МС. Это было для примера, а теперь просто представляем некую степень свободы Э, которая не может воздействовать на МС, но может это делать только через ЭМС.   У ЭМС есть собственные частоты и формы, которые связывают "Э" и "М" степени свободы. Если такая же частота будет присутствовать в МС - системе, то это будет опасно, и "Э" - воздействие будет вызывать резонанс в МС-системе. С этим вроде как понятно.   Но если я буду рассматривать единую "ЭМС+МС" - систему. У этой системы есть собственные частоты, формы будут связывать Э и М степени свободы, и ничего особенного я не увижу.. НО как понять, что нагружать эту систему нагрузкой Э опасно ?
    • gudstartup
      а 319 контроллеров у вас нигде более нет чтобы попробовать? может попробовать обычным step7 выгрузить 317 добавив туда какой нить аддон поновее версии? вы побольше выливайте все впитаем а с чего вообще взяли что аддон синумерик 1 предназначен только для тиа портала? для этого в степ 7 были аппаратные апдейты и я уверен что в тиа они тоже есть только нам сейчас недоступны
    • Andrey.V
      Совсем нет, у меня есть х8. 2016 совсем другой 
    • hlibhlib
      Нашел в инете запись про мастеркам 2016 = Оказывается, это Мастеркам 8 
    • Andrey.V
      2016 версия  Выше ответил. Оригинал файла не могу выслать, поищу что-то похожее и обязательно вышлю 
    • hlibhlib
      Может Эксклюзив????????????   Но такой версии точно не было. ))
    • GalielO
      Такой версии нет. Есть Х9 и 2017. У вас точно Mastercam?
    • Andrey_kzn
      @gudstartup , а вы впитываете информацию как губка Код у сименса хранится в контроллере в пригодном для редактирования виде. И по идее, должен выгружаться. Естественно без комментариев. Просто в нашем случае - это станок с 840DSL и контроллер  319, выгрузить проект в портал я  не могу. И в Step7 тоже не могу, пишет что-то про несовместимость версий.  Как будет в случае с настоящим Sinumerik ONE, не знаю.  Там контроллер 1500. Тут ещё надо не забывать о аппаратно-программной совместимости портала и железа, порталов уже куча разных версий вышла.  Поэтому, если перед вами станок с Sinumerik ONE, совсем не факт, что железо будет совместимо с вашей версией портала.  Станок с проектом в тиа портале у нас один,  и попробовать больше негде.  
    • hlibhlib
      Попробуй    Строй поверхности и по ним траекторию. Нет файла = нет конкретики.
×
×
  • Создать...