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

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

7 часов назад, brigval сказал:

Если известно имя компонента, можно просканировать все подсборки до деталей, найти нужную, потом составить ее путь по правилам


SelectByID2

и потом выделить.

А как еще? Не обязательно имя, можно по массе, например, или другим данным, известным заранее.

Кажется, можно собрать массив всех деталей сразу. И пройтись по нему, но это надо пробовать...

 

Имя компонента известно, неизвестно по какому пути он находится в структуре сборки.

Вопрос в том что в сборке может быть несколько одинаковых деталей в разных сборках.

Попробую описать еще раз задачу, которую пытаюсь решить.

Нужно программно выделить деталь в сборке (имеет имя компонента  swcomp.name2 ("01.02.01-1")).

Метод selectbyid2 работает только с ссылками типа: "01.02.00-1@01.00/01.02.01-1@01.02.00"

Метод getselectedbyid2string действительно возвращает такую ссылку на деталь, но для его работы нежно выделить эту деталь вручную.

Как получить эту ссылку для программного выделения зная только имя компонента и его порядковый номер в сборке?

 

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


9 часов назад, Sturmann сказал:

Имя компонента известно, неизвестно по какому пути он находится в структуре сборки.

Вопрос в том что в сборке может быть несколько одинаковых деталей в разных сборках.

Попробую описать еще раз задачу, которую пытаюсь решить.

Нужно программно выделить деталь в сборке (имеет имя компонента  swcomp.name2 ("01.02.01-1")).

Метод selectbyid2 работает только с ссылками типа: "01.02.00-1@01.00/01.02.01-1@01.02.00"

Метод getselectedbyid2string действительно возвращает такую ссылку на деталь, но для его работы нежно выделить эту деталь вручную.

Как получить эту ссылку для программного выделения зная только имя компонента и его порядковый номер в сборке?

 

Опять двадцать пять  ....

Если Вы знаете имя компонента, получаемое из свойства Name2, то в чем проблема ? Разбейте строку по символу "/", вот и получите свой путь в подсборках в виде массива строк. А там в цикле, перебирая все компоненты головной сборки, проверьте вхождение всех элементов разобранного пути в строке, получаемой методом .GetSelectByIDString(). Для дополнительного контроля вхождения компонента по глубине его вхождения в головной сборке, можно еще разбивать и строку из .GetSelectByIDString(), по символу "/" и смотреть длину получаемого массива, чтобы не выбирался компонент только из головной сборки ( но это уже может быть излишним).

Тут вопрос не по SolidWorks API, а по работе со строками...

 

Upd: возник встречный вопрос - Откуда вы получаете строку из свойства Name2 ? Если из кокого-то компонента, то что мешает из него же получить и GetSelectByIDString ?

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

Имя компонента известно, неизвестно по какому пути он находится в структуре сборки.

Вопрос в том что в сборке может быть несколько одинаковых деталей в разных сборках.

Попробую описать еще раз задачу, которую пытаюсь решить.

Нужно программно выделить деталь в сборке (имеет имя компонента  swcomp.name2 ("01.02.01-1")).

Метод selectbyid2 работает только с ссылками типа: "01.02.00-1@01.00/01.02.01-1@01.02.00"

Метод getselectedbyid2string действительно возвращает такую ссылку на деталь, но для его работы нежно выделить эту деталь вручную.

Как получить эту ссылку для программного выделения зная только имя компонента и его порядковый номер в сборке?

 

 

у компонента же есть просто метод select, уже выше писал же об этом.

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

2023-11-11-180052.png

 

 

А у меня вопрос такого характера, как получить цвет тела? Изначально накинут материал (визуальный) из библиотеки материалов, после вручную выставил цвет ему. 

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

Толи я не совсем понимаю, что такое рендер матириал, толи еще что-то не учитываю. Проблема не только с цветом, по остальным свойствам проверял - они буд-то дефолтные, а не переопределенные

 

Вообще ради чего все это затеяно, так смысл вот в чем.

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

 

            SelectionMgr = _solidWorks.IActiveDoc2.ISelectionManager;
            _activeModelDoc = _solidWorks.IActiveDoc2;

            Component2 sourceComponent = SelectionMgr.GetSelectedObjectsComponent3(1, -1);
            Component2 targetComponent = SelectionMgr.GetSelectedObjectsComponent3(2, -1);

            ModelDoc2 sourcePrtDoc = sourceComponent.IGetModelDoc();
            ModelDoc2 targetPrtDoc = targetComponent.IGetModelDoc();

            object[] sourceRenderMaterials = sourceComponent.GetRenderMaterials();

            Face2 sourceFace = (Face2)SelectionMgr.IGetSelectedObject4(1);
            Body2 sourceBody = sourceFace.IGetBody();

            Face2 targetFace = (Face2)SelectionMgr.IGetSelectedObject4(2);
            Body2 targetBody = targetFace.IGetBody();

            RenderMaterial sourceRenderMat = null;

            foreach (RenderMaterial renderMat in sourceRenderMaterials)
            {

                object[] entities = renderMat.GetEntities();
                if (entities == null) continue;
                foreach (object ent in entities)
                {

                    if (ent == (object)sourceBody || ent == (PartDoc)sourceComponent.GetModelDoc2())
                    {
                        sourceRenderMat = renderMat;
                        break;
                    }
                }
            }

            if (sourceRenderMat == null) return;
            MessageBox.Show("PrimaryColor " + sourceRenderMat.PrimaryColor);

 

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

Опять двадцать пять  ....

Если Вы знаете имя компонента, получаемое из свойства Name2, то в чем проблема ? Разбейте строку по символу "/", вот и получите свой путь в подсборках в виде массива строк. А там в цикле, перебирая все компоненты головной сборки, проверьте вхождение всех элементов разобранного пути в строке, получаемой методом .GetSelectByIDString(). Для дополнительного контроля вхождения компонента по глубине его вхождения в головной сборке, можно еще разбивать и строку из .GetSelectByIDString(), по символу "/" и смотреть длину получаемого массива, чтобы не выбирался компонент только из головной сборки ( но это уже может быть излишним).

Тут вопрос не по SolidWorks API, а по работе со строками...

 

Upd: возник встречный вопрос - Откуда вы получаете строку из свойства Name2 ? Если из кокого-то компонента, то что мешает из него же получить и GetSelectByIDString ?

01.02.01-1 - деталь с порядковым номер 1

01.02.00-1 - сборка с порядковым номер 1 где лежит эта деталь

Результат свойства name2:   01.02.00-1/01.02.01-1  (получаю пр прохождении дерева)

нужно для выделения: "01.02.00-1@01.00/01.02.01-1@01.02.00"

 

GetSelectByIDString() - метод работающий при выделенном компоненте т е компонент нужно выделить вручную. 

 

Вопрос в том чтобы выделить программно, а чтобы это сделать нужен адрес детали в формате "01.02.00-1@01.00/01.02.01-1@01.02.00"

 

 

 

11.11.2023 в 17:59, grachev.p.u сказал:

 

у компонента же есть просто метод select, уже выше писал же об этом.

метод select работает с иным форматом имени чем возвращаемый name2

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

Результат свойства name2:   01.02.00-1/01.02.01-1  (получаю пр прохождении дерева)

6 минут назад, Sturmann сказал:

GetSelectByIDString() - метод работающий при выделенном компоненте т е компонент нужно выделить вручную. 

а попробовать вызвать этот метод при прохождении дерева у компонента религия не позволяет?  У меня работает ...

        public void ShowComponentsIdForSelection(AssemblyDoc asm)
        {
            foreach (Component2 component in asm.GetComponents(false))
            {
                Console.WriteLine($"component id: {component.GetSelectByIDString()}");
            }
        }

 

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

метод select работает с иным форматом имени чем возвращаемый name2

"Если ничего не помогает, прочтите, наконец, инструкцию" (с) :

Про методы, определяемые интерфейсом IComponent2 там и про метод Select4 прочитать можно ...

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

а попробовать вызвать этот метод при прохождении дерева у компонента религия не позволяет?  У меня работает ...


        public void ShowComponentsIdForSelection(AssemblyDoc asm)
        {
            foreach (Component2 component in asm.GetComponents(false))
            {
                Console.WriteLine($"component id: {component.GetSelectByIDString()}");
            }
        }

 

Да, помогло, спасибо.

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

Как я понял, проблем с чтением имени (адреса) нет, у TS есть проблема идентифицировать нужный в дереве. Или в пространстве проектирования.

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

Здравствуйте. Что необходимо чтобы создать макросы в c# или c++?  Какая vsta должна быть установлена? Нужно Sw переустанавливать или можно это добавить через настройки? Сейчас установлен sw23, vsta2019. 

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

Здравствуйте!

Опять про экспорт в dwg.

Требуется:

Сборку сохранить в деталь - в детали скомбинировать тела (объединить) в одно тело - то что получилось сохранить в step и в dwg. В dwg должны быть подписанные виды (откуда сморим) со всех сторон. В идеале -  все на вкладке "модель".

Проблемы:

1. При объединении тел всегда получается 2 тела. А хотелось бы одно. Код честно стырен из хелпа. Как победить или на что заменить не пойму.

2. При сохранении в dwg получается файл SaveAsMacros.dwg (см. вложения). Виды повернуты не пойми как. Хотелось бы получить что-то похожее на SaveAs руками.dwg  (см. вложения). А в идеале: Хотелось бы.dwg (см. вложения).

3. После получения  SaveAsMacros.dwg, полного удивления от результата  и прочтения https://www.cadoverflow.com/t/bendlines-in-exporttodwg2/76/4 было принято решение: создать чертеж -  разместить на нем виды - сохранить в dwg.

          3.а. Чтобы создать чертеж запрашиваю имя файла с путем шаблона получаю:C:\ProgramData\SolidWorks\SOLIDWORKS 2018\templates\Чертеж.drwdot, а на самом деле:C:\ProgramData\SOLIDWORKS\SOLIDWORKS 2018\templates\gost-part drw.drwdot

Естественно чертеж не создается. Откуда взялось такое имя? Т.к. макрос пишется для народа, то получение корректного имени шаблона важно.

          3.б Имя шаблона забила константой и в результате получила Чертеж23.SLDDRW. Вид в масштабе 200:1. Как поменять масштаб на 1:1?

          3.г. Откуда такой размер листа? Задаю явно 210х294. Вроде бы и не дюймы. Откуда солид размеры взял?

Заранее спасибо за помощь.

 

Чертеж23.SLDDRW SaveAs руками.dwg SaveAsMacros.dwg Хотелось бы.dwg Чертеж23.DWG

В дополнение к предыдущему посту.

 

1.SLDPRT 3.SLDPRT 4.SLDPRT 5.SLDPRT 6.SLDPRT

gost-part drw.drwdot

Сборка.SLDASM

Записанный SaveStep.swp

Самое главное чуть не забыла.

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

С наступающими праздниками!

Вопрос в следующем.

В SW 2022 (если не обшибаюсь) появилась возможность изменения веса границы выбранных строк, столбцов, ячеек таблицы. В свойствах tableannotation нашел только BorderLineWeight (вес границ всей таблицы) и GridLineWeight (вес внутренних границ всей таблицы). Ищу возможность через api менять вес границы строк или столбцов, а не всей таблицы.

Решал ли кто-то подобную задачу?

 

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

Снимок экрана 2023-12-27 112514.png

 

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

В SW 2022 (если не ошибаюсь) появилась возможность изменения веса границы выбранных строк, столбцов, ячеек таблицы. В свойствах tableannotation нашел только BorderLineWeight (вес границ всей таблицы) и GridLineWeight (вес внутренних границ всей таблицы).

в 2021 это тоже есть.

3 минуты назад, MUXALblCH сказал:

Ищу возможность через api менять вес границы строк или столбцов, а не всей таблицы.

Решал ли кто-то подобную задачу?

Найдете, не забудьте озвучить, ибо тоже ищу ....

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

в 2021 это тоже есть.

Найдете, не забудьте озвучить, ибо тоже ищу ....

Обязательно, но есть подозрения, что в API это не реализовано.

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

Что необходимо чтобы создать макросы в c#

Инструменты-Макросы-Создать и выбрать необходимый формат для создания.

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

@ЮрЮрыч У Вас в настройках Solidworks в пункте "Включить VSTA версия 3.0" галочка стоит ? Если да, то снимите ее и попробуйте опять сохранить макрос с отличным от swp форматом.

Безымянный.png

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

@ЮрЮрыч  Тогда возможно у Вас при установке Solidworks не была выбрана какая-то опция (дословно уже не помню), связанная с возможностью создания макросов на других языках.

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

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

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

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

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

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

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

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

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

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

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




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