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

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

А поделиться со всеми??

Ответ на свой вопрос нашел здесь:

http://help.solidworks.com/2012/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iassemblydoc~getcomponents.html

Полная цитата:

"The components returned by this method can be in any order. You should not rely on the order to indicate anything about children or parents. If the hierarchy and order are important, then use IModelDoc2::FirstFeature, IFeature::GetTypeName2, IFeature::GetSpecificFeature2, IComponent2::FirstFeature, and IFeature::GetNextFeature to retrieve your information."

Ниже код для С# с пояснениями. Код получает имена всех элементов дерева построения, причем в дерево построения входят не только детали но и плоскости, начальная точка, папка датчиков, источники света, короче говоря абсолютно все что есть в дереве.

        private void button3_Click_1(object sender, EventArgs e)
        {
            SldWorks sw = new SldWorks(); // подключение к солиду
            sw.Visible = true;// делаем его видимым
            if (sw.GetDocumentCount() == 0) { MessageBox.Show("Open Assembly"); return; } // проверяем есть ли открытые документы
            IModelDoc2 sw_assem = sw.ActiveDoc; // подключение к текущему документу
            if (sw_assem.GetType() != (int)swDocumentTypes_e.swDocASSEMBLY) { MessageBox.Show("Open Assembly"); return; } // проверка текущего документа
            MessageBox.Show(sw_assem.GetTitle()); // для проверки получаем название сборки
            Feature sw_feature; // переменная "дерево"
            sw_feature = sw_assem.FirstFeature(); // получаем первый элемент дерева

            while (sw_feature != null) // перебераем все элементы дерева
            {
                MessageBox.Show(sw_feature.Name); // для лучшего понимания, что именно получили, отображаем имя полученного элемента
                sw_feature = sw_feature.GetNextFeature(); // следующий элемент
            }
            MessageBox.Show("Done"); // Оповещение об окончании
        }
Изменено пользователем sova2004
Ссылка на сообщение
Поделиться на других сайтах


@@sova2004, есть путь попроще. Надо просто перебрать дерево как TreeView


static void Main(string[] args)

{

    Type swType = Type.GetTypeFromProgID("SldWorks.Application");

    ISldWorks app = (ISldWorks)Activator.CreateInstance(swType);

    if (app != null)

    {

        IModelDoc2 swDoc = app.IActiveDoc2;

        TreeControlItem item = swDoc.FeatureManager.GetFeatureTreeRootItem();

        TraverseItem(item);

    }

}

 

static void TraverseItem(TreeControlItem item)

{

    if (item.ObjectType == (int)swTreeControlItemType_e.swFeatureManagerItem_Component)

    {

        IComponent2 comp = item.Object as IComponent2;

        System.Diagnostics.Debug.Print(comp.Name2);

    }

    TreeControlItem child = item.GetFirstChild();

 

    while (child != null)

    {

        TraverseItem(child);

        child = child.GetNext();

    }

}

 

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

Поскольку понимание и использование рекурсии для меня сложны, предыдущий код с использование TreeControlItem сделал так:

SldWorks sw = new SldWorks(); // подключение к солиду
           sw.Visible = true;// делаем его видимым
            if (sw.GetDocumentCount() == 0) { MessageBox.Show("Open Assembly"); return; } // проверяем есть ли открытые документы
            IModelDoc2 sw_assem = sw.IActiveDoc2; // подключение к текущему документу
            if (sw_assem.GetType() != (int)swDocumentTypes_e.swDocASSEMBLY) { MessageBox.Show("Open Assembly"); return; } // проверка текущего документа
            Component sw_tree_comp; // новая переменная - компонент
            ModelDoc sw_tree_model;
            TreeControlItem item;
            
            item = sw_assem.FeatureManager.GetFeatureTreeRootItem();
            TreeControlItem child = item.GetFirstChild();
            
            while (child != null)
            {
                if (child.ObjectType == (int)swTreeControlItemType_e.swFeatureManagerItem_Component)
                {
                    sw_tree_comp = (Component)child.Object;
                    sw_tree_model = sw_tree_comp.GetModelDoc();
                    MessageBox.Show(sw_tree_comp.GetPathName() + " " + sw_tree_model.GetTitle());
                }
                child = child.GetNext();
            }
            MessageBox.Show("Done"); // Оповещение об окончании

Может кто подскажет название метода для получения ссылок на модели в чертеже (замену нашел), а то что-то поиск по справке много времени занимает.

И еще, можно ли получить свойство чертежа, не открывая его (интересует формат чертежа)?

Ссылка на сообщение
Поделиться на других сайтах
Про TreeControlItem я не знал. Спасибо. А вот рекурсию не каждый осилит.

 

Так он тоже 

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

 

Получается очень долго..

А вот если поискать в хелпе по слову "TraverseComponent", можно обойтись только получением имен сборок и деталей..

 

 

 

 

 

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

а для кого Enum написан? swFeatureManagerItem_Component - только компоненты, никаких плоскостей и прочей эскизни.

Ссылка на сообщение
Поделиться на других сайтах
Может кто подскажет название метода для получения ссылок на модели в чертеже (замену нашел), а то что-то поиск по справке много времени занимает. И еще, можно ли получить свойство чертежа, не открывая его (интересует формат чертежа)?

Решил так:

using SolidWorks.Interop.swdocumentmgr;
...
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            fbd.ShowDialog();
            if (fbd.SelectedPath.Length > 0)
            {
                const string sLicenseKey = "...";
                SwDMClassFactory swClassFact = default(SwDMClassFactory);
                ISwDMApplication swDocMgr = default(ISwDMApplication);
                SwDMDocument swDoc = default(SwDMDocument);
                SwDMDocument16 swDoc16 = default(SwDMDocument16);
                SwDmDocumentOpenError nRetVal = 0;
                swClassFact = new SwDMClassFactory();
                swDocMgr = swClassFact.GetApplication(sLicenseKey);

                foreach (string draw in Directory.GetFiles(fbd.SelectedPath))
                {
                    if (Path.GetExtension(draw) == ".SLDDRW")
                    {
                        swDoc = (SwDMDocument)swDocMgr.GetDocument(draw, SwDmDocumentType.swDmDocumentDrawing, false, out nRetVal);
                        swDoc16 = (SwDMDocument16)swDoc;
                        string val, link;
                        SwDmCustomInfoType nPropType = 0;
                        string linkedTo;
                        val = swDoc16.GetCustomPropertyValues("Format", out nPropType, out linkedTo);// здесь формат
                        link = swDoc.GetAllExternalReferences()[0]; // здесь ссылка
                    }
                }
            }

В чертеже поле Format со значением $PRP:"SW-Sheet Format Size"

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

Здравствуйте! Подскажите пожалуйста где хранится следующая информация об объектах в  API SW

-Обозначение

-наименование

-тип объекта (деталь, сборка…)

- имя файла

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

Здравствуйте! Подскажите пожалуйста где хранится следующая информация об объектах в  API SW

-Обозначение

-наименование

-тип объекта (деталь, сборка…)

- имя файла

 

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

Обозначение и наименования в пользовательских свойствах - нужно наперед знать как поля называются, вместо description подставляете название поля которого нужно узнать. Если есть конфигурации, тогда CustomInfo2 с указанием нужной конфигурации.

С типом документа и именем файла проще, ниже код.

            SldWorks sw = new SldWorks();
            ModelDoc2 sw_doc = sw.ActiveDoc;
            
            string type = "";
            if (sw_doc.GetType() == (int)swDocumentTypes_e.swDocASSEMBLY) { type = "Сборка"; }
            if (sw_doc.GetType() == (int)swDocumentTypes_e.swDocDRAWING) { type = "Чертеж"; }
            if (sw_doc.GetType() == (int)swDocumentTypes_e.swDocPART) { type = "Деталь"; }
            if (sw_doc.GetType() == (int)swDocumentTypes_e.swDocNONE) { type = "Ничего"; }
            MessageBox.Show("Тип документа = " + type);

            MessageBox.Show("Имя файла = " + sw_doc.GetPathName());

            MessageBox.Show(sw_doc.get_CustomInfo("description"));
Ссылка на сообщение
Поделиться на других сайтах
  • 2 недели спустя...

Здравствуйте. Кто знает где взять что-то подобное... или есть у кого-нить литература по написанию макросов. Заранее спасибо !

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

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

Полистав форум и почесав репу сфабриковал макрос

 

Sub main()
 
Application.SldWorks.ActiveDoc.ActiveView.Scale2 = 0.92
 
End Sub
 
И всё бы хорошо. Графику наблюдаю в желаемом масштабе. Но центральная точка взгляда находится в самом неожиданном месте, но не там где хочется.
Вопрос: как сохранить установленный взгляд вида, используя код VBA? 
Ссылка на сообщение
Поделиться на других сайтах

Спасибо!

Но имхо это код показывает модель как команда "Показать в размер экрана". имхо не совсем то. Я хочу вдеть часть модели в установленном мной масштабе.

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

Максимум, что пришло наобум в голову))

 

Sub main()
  Dim swApp     As SldWorks.SldWorks
  Dim swModel   As SldWorks.ModelDoc2
  Dim swModView As SldWorks.ModelView
 Set swApp = Application.SldWorks
 Set swModel = swApp.ActiveDoc
 Set swModView = swModel.ActiveView
swModel.ViewZoomtofit2
swModView.Scale2 = 0.92
swModel.WindowRedraw
End Sub
Чот тоже не то.

Добавлено: а хотя ТО. Добавьте камеру в модель. тогда будет по центру масштабировать.

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

Ага. Попробую с камерой поэкспериментировать, а то я никогда её не применял. Но только дома.... Спасибо!

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

Добрый вечер всем! Хотелось бы уточнить, для редактирования элемента детали в с# мы пишем имя того или иного размера/параметра "Dn@Эскиз1/Бобышка-вытянуть1 и т.д."

Столкнулся с проблемой тонкостенного элемента. Когда пишу параметр "T1@Вытянуть-Тонкостенный1" Visual выдает ошибку:

 

90c5bfe02dc3.png

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

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

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

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

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

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

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

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

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

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

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




  • Сообщения

    • Рома калужский
      это код подключения шпинделя как ось "С" но при этом он не перемещает револьверку, т.е. не работает по программе
    • Горыныч
      Еще совет: строить нужно только половину, если модель симметричная, тогда Солид меньше "косячит". И соглашусь с коллегами, идеальный вариант для гладкого построения - два сечения и две направляющие кривые, т.е. 4 управляющие кривые (кромки). При необходимости можно добавлять не только промежуточное сечение, но и направление. Не нужно пятаться построить всю поверхность одним фичером.  Пусть поверхности будут лоскутами, но соединяются по касанию или кривизне. 
    • ДОБРЯК
      Откуда появится смещение центра масс колеса, если колесо сбалансировано.  Жесткий сбалансированный вал, это условие данной задачи. На 4000 оборотах эти силы будут минимальны. Это разговор ни о чем в данной задаче. :=) Но даже если вы абсолютно точно определите эти частоты, с учетом всех сил. Что дальше с этими частотами делать? На основании чего делать вывод о работоспособности изделия? Это в учебной работе получили число, работу приняли и сдали в архив. Какая практическая ценность всех этих уточнений в данном случае?:=)  
    • Борман
      Если еще не поздно... я и сам погрузился бы. Физика такая, для вала с одним колесом... F - это понятно, центробежное смещение центра масс колеса M - момент от центробежных сил, который не появится, если колесо не повернется при изгибе вала. Обрати внимание, что BW-момент выворачивает ось в сторону действия силы F, т.е. при обратной прецессии они действуют сообща, и в этом опасность.   Отсюда будут разные собственные частоты при прямой и обратной прецессиях.  Теперь осталось понять, что такое прямая и обратная прецессии :), и почему момент при них направлен в разные стороны. По первой части вопроса см. мою картинку в этой теме от 27 августа 2013. По второй части вопроса - нужно включать воображение и усердно рисовать на бумажке. Мне пока сложно.    Физика именно такая. Нужно как то оценить величину этого момента и приложить его в софте, который не умеет ДК. А с тестовыми значениями можно и так порешать, и на выходе должна быть вилка. Т.е. F - задает типа "биссектрису" вилки (престресс-модальник), а момент - угол вилки.  
    • boomeeeer
      @anykeyto Я не оператор. Настраивал работу этой функции на токарно-фрезерном, где нужно было позиционировать шпиндель, для нарезания пазов. Что такое G07 не знаю. Вот такой пример для фрезерного станка нашёл   G108 B0; переключение на ось B для управления положением; G68.2 X10 Y10 Z20 I0 J90 K0 Положение заготовки (10,10,20) Угол Эйлера для определения характеристической системы координат; G53.2 Управление направлением инструмента   G109 B0 - отключит режим
    • anykeyto
      Ага, спасибо... А в связке с G07.1 это как работает? Есть детали ,кольца, на которых надо делать по 4 паза. Сейчас программист написал прогу под шаровую фрезу. Там рабочие движеня происходят через одновременное смещение по оси Х и Z... фреза убивается буквально на третьем кольце, да и обработка получаестя фиговой.. На сколько я понимаю надо стремиться к тому, чтобы на 5ти осном станке фреза всегда была перпендикулярна касательной ли самой поверхности. Мне посоветовал как раз цилндрческую интерполяцию, когда ось С преобразуется в плоскость. В мануале к HNC описано эт криво, но в примерах программ как раз сначала включается CTOS и потом G07.1. но дальше как запрограммировать понимания пока нет...  P.S. хочу добавить, что на 5-снике раньше работал только как оператор по готовым программам  на Хенденхайне. А сейчас на новом предприятии на новой для меня стойке нужно все делать с нуля и самостоятельно. С одной стороны интересно, с другой стороны спросить не у кого, в инете инфы по стойке нет от слова совсем, уж тем более видео....  чем это отличается от просто G0 C180? Или это уже будет шпиндель позиционироваться, а не стол?
    • AlexKaz
      Различают жёсткие и гибкие ротора. В данном случае вал жёсткий. Для него соответствуюшая формула. 4000 об/мин = 66.67 Гц, это ни о чём, эффекты для такой частоты почти не скажутся на жёстком роторе. Но проблема в том, что в лопаточных машинах (а насос на скрине наверное лопаточная?) собственные кратны числу лопаток. Я не разбирался в вопросе чтобы что-то здесь советовать. Лучше не спешить и внимательно почитать про модальный в лопаточных. Заодно проверить, а какое нагружение идёт в деталях насоса чтобы корректно выполнить престресс.
    • ДОБРЯК
      Хотите еще и матрицу масс изменить. :=) И сколько килограмм воды будете присоединять?  Опыт правильного моделирования, опыт расчета таких конструкций накапливается десятилетиями. Маловероятно, что кто-то на форуме будет вам объяснять как правильно моделировать, какие КЭ использовать, какие граничные условия задавать и т. д. Вы же всегда уклоняетесь от разговора на эти темы, даже для простых моделей.  Даже если перейдете на Ансис и не разберётесь в том, что он считает это не поможет вам написать грамотный отчет и объяснить грамотному заказчику, что вы там насчитали. Считает расчетчик, а программа это инструмент. Это только в рекламе пишут, что купите программу трехмерного моделирования, сделайте трехмерную модель, потом нажмите одну кнопку и на обычном игровом компьютере все посчитаете. Только в жизни все немножко иначе...:=)
    • Jesse
      Вот что у Биргера: Центробежные силы и индуцированный гироскопический момент зависят от квадрата частоты вращения вала   Хотя уже сама критическая частота зависит только от момента инерции колеса (альфа, бэта, гамма - это прогибы, углы поворота и прочая шелуха), т.е. частота вращения в формулу не входит, а всё определяется только моментом инерции Jm Ну у него рассматривается простая одномассовая система (фактически грузик на пружинке). Думаю поискать публикации.. мб где то раскопали аналитическую зависимость первой и высшей СЧ от частоты вращения для сложных систем. Хотя если выяснится что зависит,  всё равно обоснование придумывать придётся.  Эхх...
    • Fedor
      https://www.litres.ru/book/v-n-faddeeva/vychislitelnye-metody-lineynoy-algebry-65999878/  Ну и классику жанра :) 
×
×
  • Создать...