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

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

Еще можно, как вариант, посмотреть, в том числе, и в сторону GetDrawingComponent.

Сам не пробовал пока.

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


1 час назад, brigval сказал:

Посмотрел малость.

Когда вы выходите на Body, то как бы заходите внутрь детали и просматриваете Features детали.

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

Поэтому Entity.GetComponent будет всегда Null

Чтобы Entity выдал компонент сборки, изображенной на виде, этот Entity должен быть примитивом (линией, поверхностью, вершиной или swViewEntityType_SilhouetteEdge), видимым на виде чертежа.

Поэтому, задача может быть такой - от штриховки перейти к примитивам вида.

Как это выполнить пока не понятно.

Есть такой интерфейс ISldWorks::IsSame  сравнивает два объекта - вроде можно проверять (сравнивать) Feature и определять Component2. Но это сходу и без должной проверки ....

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

Посмотрел малость.

Когда вы выходите на Body, то как бы заходите внутрь детали и просматриваете Features детали.

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

Поэтому Entity.GetComponent будет всегда Null

Чтобы Entity выдал компонент сборки, изображенной на виде, этот Entity должен быть примитивом (линией, поверхностью, вершиной или swViewEntityType_SilhouetteEdge), видимым на виде чертежа.

Поэтому, задача может быть такой - от штриховки перейти к примитивам вида.

Как это выполнить пока не понятно.

И чтобы этот Entity выдал компонент сборки на чертеже надо выбрать элементы этого компонента (Face, Edge, Vertex...) мышкой.

Далее часть рабочего кода.

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

        private void cmdOK_Click(object sender, EventArgs e)
        {
            SldWorks swApp = GetActiveSolidWorks();
            if (swApp == null)
                return;
            ModelDoc2 swModel = swApp.IActiveDoc2;
            if (swModel == null)
                return;
            int docType = swModel.GetType();
            if(docType != (int)swDocumentTypes_e.swDocDRAWING)
                return;
            DrawingDoc swDrawing = swModel as DrawingDoc;
            SelectionMgr swSelMgr = swModel.ISelectionManager;
            int selCount = swSelMgr.GetSelectedObjectCount();
            if (selCount != 2)
                return;

            SwView swView = null;
            SwEntity swEntity = null;

            for (int i = 1; i <= selCount; i++)
            {
                swSelectType_e selType = (swSelectType_e)swSelMgr.GetSelectedObjectType2(i);
                switch (selType)
                {
                    case swSelectType_e.swSelDRAWINGVIEWS:
                        swView = swSelMgr.GetSelectedObject5(i) as SwView;
                        break;
                    case swSelectType_e.swSelFACES:
                    case swSelectType_e.swSelEDGES:
                    case swSelectType_e.swSelVERTICES:
                        swEntity = swSelMgr.GetSelectedObject5(i) as SwEntity;
                        break;
                }

            }
            if (swView == null)
                return;
            if (swEntity == null)
                return;
            DrawingComponent swDrwComponent = swEntity.GetDrawingComponent(swView);
            if (swDrwComponent == null)
                return;
            string nameComponent = swDrwComponent.Name;
            Component2 swComponent = swDrwComponent.Component;
            
            // далее рабочий код
            // ===================
        }

 

А через FaceHatch компонент на чертеже получить не получиться.

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

Есть такой интерфейс ISldWorks::IsSame  сравнивает два объекта - вроде можно проверять (сравнивать) Feature и определять Component2. Но это сходу и без должной проверки ....

Функцией

GetVisibleComponents

получить все видимые компоненты вида, потом в каждом компоненте, в его детали, сравнением проверить наличие Body из штриховки.  Думаю, может сработать.

Компонент, Body которого совпадает с Body из штриховки и будет искомым.

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

Функцией




GetVisibleComponents

получить все видимые компоненты вида, потом в каждом компоненте, в его детали, сравнением проверить наличие Body из штриховки.  Думаю, может сработать.

Компонент, Body которого совпадает с Body из штриховки и будет искомым.

Я для себя нарисовал такой алгорим (ужасны до безбразия, но раз горничной не видно ...):

1) Сразу получаем из сборки список всех компоненов и навешиваем им куда-нить шаблон для штриховки ( пока без сортировки сварная или нет, сейчас хотя бы просто соотнести компоненты и их виды на чертеже).

2) Проходя по всем видам чертежа определяем виды где IView :: GetFaceHatchedCount > 0 ;

3) В выбраном виде выбираем компоненты  методом  GetVisibleComponents ;

4) (Тут начинается ужас) Проходим циклом вида:

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

object[] vF = view.GetVisibleEntities2(c, (int)swViewEntityType_e.swViewEntityType_Face);

                if( vF == null )
                {
                    // типа нет граней
                }
                else
                {

                 foreach (Face2 f in vF)
                    {
                        swModel.ClearSelection2(true);

                        Body2 bf = f.GetBody();
                        Feature ff = bf.GetFeatures()[0];
                        Entity en = (Entity)ff;
                        if (view.GetFaceHatchCount() > 0)
                        {
                            foreach (FaceHatch fh in view.GetFaceHatches())
                            {

                                Face2 ffh = fh.Face;
                                double[] nf = ffh.Normal;
                                if (nf[1] != -1) // отсекаем часть лишних FaceHatch но у меня условие может быть не совсем корретно (там 3 координаты нормали )
                                {

                                    Body2 bfh = ffh.GetBody();
                                    Feature fefh = bfh.GetFeatures()[0];
                                    Entity ent = (Entity)fefh;

                                    int same = swApp.IsSame(en, ent); // сравниваем Entity из списка компонентов и выбранный по FaceHatch

                                    if(same == 1)
                                    {
                                        fh.UseMaterialHatch = false;
                                        fh.Angle = d_angle; // угол, или что там мы привязали в п.1
                                    }

                                }
                            }
                        }
                    }
                }
            }  // по количеству закрывающих скобочех, если не угадал, то извините....

Что-то такое.

 

З.Ы. там еще надо добавить в начале кода, сделаю чуть позже, извините. Но принцип такой...

 

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

Я для себя нарисовал такой алгорим (ужасны до безбразия, но раз горничной не видно ...):

1) Сразу получаем из сборки список всех компоненов и навешиваем им куда-нить шаблон для штриховки ( пока без сортировки сварная или нет, сейчас хотя бы просто соотнести компоненты и их виды на чертеже).

2) Проходя по всем видам чертежа определяем виды где IView :: GetFaceHatchedCount > 0 ;

3) В выбраном виде выбираем компоненты  методом  GetVisibleComponents ;

4) (Тут начинается ужас) Проходим циклом вида:

Что-то такое.

 

З.Ы. там еще надо добавить в начале кода, сделаю чуть позже, извините. Но принцип такой...

 

На С не программирую, поэтому читать сложно. Но принцип понятен.

Время, наверное, у Солида может много уходить, особенно если сборка большая.

Но это уже второй вопрос.

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

Первый выезд "чугуниевого", а, скорее из чего-то и палок, велосипеда.

Почему-то не хочет работать с обычными разрезами - глючит - вылетает может попортить сам чертеж, но если на чертеже вырывы, местные виды со штриховками, то вроде немного фунциклирует.

 

Исходники и в bin/debug  есть exe-шник.

HatchManager.zip

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

Первый выезд "чугуниевого", а, скорее из чего-то и палок, велосипеда.

Почему-то не хочет работать с обычными разрезами - глючит - вылетает может попортить сам чертеж, но если на чертеже вырывы, местные виды со штриховками, то вроде немного фунциклирует.

 

Исходники и в bin/debug  есть exe-шник.

HatchManager.zip 85 \u041a\u0431 · 0 скачиваний

Поздравляю!

Выскочила ошибка. Послал в личку.

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

Может, кто-то в курсе?

Чертежный вид в сборочном чертеже.

Нахожу в нем нужный компонент. Считываю видимые вершины, концы линий изображающих компонент. Нахожу координаты вершин.

Теперь вопрос.

Относительно чего, какого нуля, эти координаты?

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

Относительно чего они могут быть?

Задача такая - найти координаты вершин отностительно нуля чертежа.

 

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

Может, кто-то в курсе?

Чертежный вид в сборочном чертеже.

Нахожу в нем нужный компонент. Считываю видимые вершины, концы линий изображающих компонент. Нахожу координаты вершин.

Теперь вопрос.

Относительно чего, какого нуля, эти координаты?

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

Относительно чего они могут быть?

Задача такая - найти координаты вершин отностительно нуля чертежа.

 

Вроде как нуля вида.

3 часа назад, nicomed сказал:

Первый выезд "чугуниевого", а, скорее из чего-то и палок, велосипеда.

Почему-то не хочет работать с обычными разрезами - глючит - вылетает может попортить сам чертеж, но если на чертеже вырывы, местные виды со штриховками, то вроде немного фунциклирует.

 

Исходники и в bin/debug  есть exe-шник.

HatchManager.zip 85 \u041a\u0431 · 2 скачивания

Только что то долго код обрабатывал. 4 вида, на трех штриховка. 20 видимых компонентов на виде.

P.S. Меня больше убили свойства FaceHatch. FaceHatch.Angle введен в SW2003, а FaceHatch.HatchScope в SW2020. 17 лет чтобы была возможность программно менять принадлежность штриховки к виду, телу, региону или компоненту!!!!

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

Вроде как нуля вида.

Не проходит. Нижний угол вида показывает 71 под курсором, а  почти рядом вершина программно - 160. (

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

Не проходит. Нижний угол вида показывает 71 под курсором, а  почти рядом вершина программно - 160. (

Да, я был не прав. Похоже, что на видах (StandartView, ProjectedView, AuxiliaryView) ноль - это ноль сборки, а в SectionView надо учитывать координаты линии разреза. То есть, если линия разреза проходит, допустим строго вертикально по координате х =50, то на разрезе все вершины, которые попали в разрез будут иметь  х = 50, остальные в координатах сборки. Так я понял.

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

Только что то долго код обрабатывал. 4 вида, на трех штриховка. 20 видимых компонентов на виде.

P.S. Меня больше убили свойства FaceHatch. FaceHatch.Angle введен в SW2003, а FaceHatch.HatchScope в SW2020. 17 лет чтобы была возможность программно менять принадлежность штриховки к виду, телу, региону или компоненту!!!!

С  учетом возможностей открытого API в этом направлении, я такое и подозревал. Что мешает ввести в тот же IFace  интерфейс IsFaceHatch или подобное ? Или внятное получение компонента из самого FaceHatch-а ? Хотя подозреваю в закрытой части API что-то такое будет....

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

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

Да, я был не прав. Похоже, что на видах (StandartView, ProjectedView, AuxiliaryView) ноль - это ноль сборки, а в SectionView надо учитывать координаты линии разреза. То есть, если линия разреза проходит, допустим строго вертикально по координате х =50, то на разрезе все вершины, которые попали в разрез будут иметь  х = 50, остальные в координатах сборки. Так я понял.

Координаты вершины в точке 0,0 сборки не равны координатам 0,0 полученным программно с вида чертежа. И разница очень существенная. Вот и интересно, что показывают X,Y. 

А вот Z в сборке у меня совпадает с Z с чертежа.

 

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

 День добрый!

Прошу помощи общественности.

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

Затем на каждом виде читает список DrawingComponent (вопрос не в нем, просто читает для общей масы информации).

После читает список видимых компонентов (Component2) и с соотносит каждый из этих компонентов с компонентами из dictionary.

Если вид без разреза, то тот способ что я применил работает, если есть разрезы или вырывы - то ах!

Теперь вопрос:

 Что надо вписать в код, что бы в результатх фраз: "не найден" не было ? (ориентировочное место правок помечено в коде)

 

З.Ы. cо спецификациями SW не работал ни разу, поэтому, просьба, делать поправку на мою дикость в этом вопросе.

З.Ы.Ы. во вложении так же моя тестова сборка (что бы была понятна заложенная глубина вхождений).

  версия программы - SW2019 sp5

 

 hatch.zip

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

День добрый!

Прошу помощи общественности.

 

 Вопрос пока снят. Решил через : AssemblyDoc :: GetComponentByName().

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

Господа, есть ли люди готовые написать API под следующую задачу:

1. Есть спецификация панелей в экселе, в которой записаны следующие данные - № п/п; Длина; Ширина; Маркировка (вырезается номер на станке лазерной резки); количество.

2. Соответственно, у деталей отличаются длина, ширина и гравировка. Но гибы на всех панелях одинаковые.

3. Нужно скормить приложению таблицу, а на выходе получить модели  и чертежи в солид воркс, развертки в .dxf в название dxf должно быть  указанно количество

4. Желательно что наименование каждой панели соответствовало определённому правилу. 

 

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

Надеюсь никаких  правил форума я не нарушил )) 

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

Господа, есть ли люди готовые написать API под следующую задачу:

1. Есть спецификация панелей в экселе, в которой записаны следующие данные - № п/п; Длина; Ширина; Маркировка (вырезается номер на станке лазерной резки); количество.

2. Соответственно, у деталей отличаются длина, ширина и гравировка. Но гибы на всех панелях одинаковые.

3. Нужно скормить приложению таблицу, а на выходе получить модели  и чертежи в солид воркс, развертки в .dxf в название dxf должно быть  указанно количество

4. Желательно что наименование каждой панели соответствовало определённому правилу. 

 

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

Надеюсь никаких  правил форума я не нарушил )) 

похоже справится обычная таблица параметров в Excel

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

Господа, есть ли люди готовые написать API под следующую задачу:

1. Есть спецификация панелей в экселе, в которой записаны следующие данные - № п/п; Длина; Ширина; Маркировка (вырезается номер на станке лазерной резки); количество.

2. Соответственно, у деталей отличаются длина, ширина и гравировка. Но гибы на всех панелях одинаковые.

3. Нужно скормить приложению таблицу, а на выходе получить модели  и чертежи в солид воркс, развертки в .dxf в название dxf должно быть  указанно количество

4. Желательно что наименование каждой панели соответствовало определённому правилу. 

 

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

Надеюсь никаких  правил форума я не нарушил )) 

 

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

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

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

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

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

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

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

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

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

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

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




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