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

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

Может так:
 

ExtrudeFeatureData2 swExtrude = swFeature.GetDefinition();

Ну и там уже море всего IExtrudeFeatureData2

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


Ну и там уже море всего IExtrudeFeatureData2

Да, вроде бы это тот интерфейс, спасибо!

..вот только для моей задачи что то не получается. я делаю вырез на уровне сборки с распространением выреза в детали. Этот же интерфейс, судя по всему работает по вырезу в детали, ну или по этому же вырезу в сборке при включении режима редактирования детали в контексте сборки. Я конечно надеюсь, что вы опровергните мой вывод.. Ну просто у меня не получается получить список компонентов, на которые повлиял вырез. Да и что уж там - у меня не получилось даже изменить какие либо флаги в этом интерфейсе. Как я понял, для того чтобы изменения в интерфейсе назначились на вырез, нужно применить метод ModifyDefinition. Но у этого метода нужно указать конкретный компонент в сборке, к которому применяется вырез.

Наверно мой вопрос звучит так: можно ли вообще модифицировать вырезы, сделанные в контексте сборки?

 

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

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

Вырез делаете в сборке - а модифицировать его хотите в компоненте? Так даже обычными средствами солида нельзя.


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

так укажите сборку))) 

 

Спасибо, вроде бы разобрался. В моём случае в качестве ссылки на компонент просто не надо ничего указывать: ( nullptr )

selFeat->ModifyDefinition( (Object^)cutFeat, curDoc, nullptr );

В который раз благодарствую за подсказки!

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

Приветствую всех!

Столкнулся с проблемой создания элемента «Повернутая бобышка/основание», а именно «выбор контура» для поворота вдоль осевой линии.

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

Подскажите, пожалуйста, в чем ошибка:

swApp.NewPart(); //создание новой детали
            swModel = null;
            bool boolstatus = false;
            double d = Convert.ToDouble(d.Text);
            swModel = (ModelDoc2)swApp.ActiveDoc;
            boolstatus = swModel.Extension.SelectByID2("Сверху", "PLANE", 0, 0, 0, false, 0, null, 0);
            swModel.SketchManager.InsertSketch(true);
            swModel.ClearSelection2(true);
            swModel.IActiveView.EnableGraphicsUpdate = false;
            SketchSegment okr = null;
            okr = ((SketchSegment)(swModel.SketchManager.CreateLine(0, 0, 0, 0, 0.003, 0)));
            okr = ((SketchSegment)(swModel.SketchManager.CreateLine(0, 0.003, 0, (d + 2) / 1000, 0.003, 0)));
            okr = ((SketchSegment)(swModel.SketchManager.CreateLine((d + 2) / 1000, 0.003, 0, (d + 2) / 1000, 0, 0)));
            swModel.SetInferenceMode(false);          
            okr = ((SketchSegment)(swModel.SketchManager.CreateLine((d + 2) / 1000, 0, 0, (d + 1) / 1000, 0, 0)));
            okr = ((SketchSegment)(swModel.SketchManager.CreateLine((d + 1) / 1000, 0, 0, (d + 1) / 1000, 0.002, 0)));
            okr = ((SketchSegment)(swModel.SketchManager.CreateLine((d + 1) / 1000, 0.002, 0, 0.001, 0.002, 0)));
            okr = ((SketchSegment)(swModel.SketchManager.CreateLine(0.001, 0.002, 0, 0.001, 0, 0)));
            swModel.SetInferenceMode(true);
            okr = ((SketchSegment)(swModel.SketchManager.CreateLine(0.001, 0, 0, 0, 0, 0)));
            swModel.ClearSelection2(true);
            boolstatus = swModel.Extension.SelectByID2("Point2", "SKETCHPOINT", 0, 0.003, 0, false, 0, null, 0);
            okr = ((SketchSegment)(swModel.SketchManager.CreateChamfer((int)swSketchChamferType_e.swSketchChamfer_DistanceEqual, 0.0005, 0)));
            boolstatus = swModel.Extension.SelectByID2("Point3", "SKETCHPOINT", (d + 2) / 1000, 0.003, 0, false, 0, null, 0);
            okr = ((SketchSegment)(swModel.SketchManager.CreateChamfer((int)swSketchChamferType_e.swSketchChamfer_DistanceEqual, 0.0005, 0)));
            okr = ((SketchSegment)(swModel.SketchManager.CreateCenterLine((2 * d + 2) / 1000, 0, 0, (2 * d + 2) / 1000, 0.003, 0)));
            swModel.SketchManager.FullyDefineSketch(true, true, (int)swSketchFullyDefineRelationType_e.swSketchFullyDefineRelationType_Vertical | (int)swSketchFullyDefineRelationType_e.swSketchFullyDefineRelationType_Horizontal, true, 1, 6, 1, 6, -1, -1);
            swModel.IActiveView.EnableGraphicsUpdate = true;
            swModel.ClearSelection2(true);
            boolstatus = swModel.Extension.SelectByID2("Line11", "SKETCHSEGMENT", 0.034000000000000002, 0, 0, false, 16, null, 0);
            boolstatus = swModel.Extension.SelectByID2("Эскиз1", "SKETCH", 0.006294566125047113, 0.0075031558737677449, 0.010187557983686823, true, 2, null, 0);
            swModel.ISelectionManager.EnableContourSelection = true;
            boolstatus = swModel.Extension.SelectByID2("Эскиз1", "SKETCHREGION", 0.006294566125047113, 0.0075031558737677449, 0.010187557983686823, true, 2, null, 0);
            Feature myFeature = null;
            myFeature = ((Feature)(swModel.FeatureManager.FeatureRevolve2(true, true, false, false, false, false, 0, 0, 6.2831853071796004, 0, false, false, 0.0050000000000000001, 0.0050000000000000001, 0, 0, 0, true, true, true)));
            swModel.ISelectionManager.EnableContourSelection = false;

PS Не понимаю, почему SolidWorks требует указать контур для вращения, ведь когда строишь в ручную такую деталь, обычного выделения эскиза хватает для построения тела вращения.

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

Приветствую всех!

Столкнулся с проблемой создания элемента «Повернутая бобышка/основание», а именно «выбор контура» для поворота вдоль осевой линии.

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

Подскажите, пожалуйста, в чем ошибка:


            swModel.ClearSelection2(true);
            boolstatus = swModel.Extension.SelectByID2("Эскиз1", "SKETCH", 0.006294566125047113,
 0.0075031558737677449, 0.010187557983686823, true, 2, null, 0);

            boolstatus = swModel.Extension.SelectByID2("Эскиз1", "SKETCHREGION", 0.006294566125047113,
 0.0075031558737677449, 0.010187557983686823, true, 2, null, 0);
            Feature myFeature = null;
            myFeature = ((Feature)(swModel.FeatureManager.FeatureRevolve2(true, true, false, false, false, false, 0, 0, 6.2831853071796004, 0, false, false, 0.0050000000000000001, 0.0050000000000000001, 0, 0, 0, true, true, true)));

PS Не понимаю, почему SolidWorks требует указать контур для вращения, ведь когда строишь в ручную такую деталь, обычного выделения эскиза хватает для построения тела вращения.

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

п.с. в коде есть лишние куски. "SKETCHREGION" по моему вообще не нужен.

Изменено пользователем maxfox
Ссылка на сообщение
Поделиться на других сайтах
и всё должно сработать
 попробуйте сами  :smile: при не закрытом эскизе выбрать и ось и регион.
Ссылка на сообщение
Поделиться на других сайтах

Ваша ключевая ошибка скорее всего только в строках выделения Оси и Эскиза. Вы почему то при выделении маркируете оба объекта двойкой.

 

 

maxfox, так у меня она и так с номером 16

 

 

boolstatus = swModel.Extension.SelectByID2("Line11", "SKETCHSEGMENT", 0.034000000000000002, 0, 0, false, 16, null, 0);

 

 

 

 попробуйте сами  при не закрытом эскизе выбрать и ось и регион.

 

 

 

Не получается. Пишу следующие строки


boolstatus = swModel.Extension.SelectByID2("Line11", "SKETCHSEGMENT", 0.034000000000000002, 0, 0, false, 16, null, 0);
            swModel.ClearSelection2(true);
            swModel.ISelectionManager.EnableContourSelection = true;
            boolstatus = swModel.Extension.SelectByID2("Эскиз1", "SKETCHREGION", 0.006294566125047113, 0.0075031558737677449, 0.010187557983686823, true, 2, null, 0);
            Feature myFeature = null;
            myFeature = ((Feature)(swModel.FeatureManager.FeatureRevolve2(true, true, false, false, false, false, 0, 0, 6.2831853071796004, 0, false, false, 0.0050000000000000001, 0.0050000000000000001, 0, 0, 0, true, true, true)));
            swModel.ISelectionManager.EnableContourSelection = false;

Я заметил одну странную особенность, если остановить выполнение кода до выделения, т.е момента когда эскиз полностью определиться (становится черным) и потянуть за какую нибудь точку (экран при этом еле видно моргнёт), а затем возобновить выполнение кода, то тогда элемент «Повернутая бобышка/основание» строиться. Но как это программно реализовать не знаю... Пробовал функцией swModel.EditRebuild3(); но и она не помогает.

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

PS Сейчас попробовал при остановленном коде зайти в меню элемента «Повернутая бобышка/основание» и ничего не трогая выйти, а после запустил код. Элемент построился... чудеса какие то... :sad:

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

Глянул ещё раз выполнение кода: почему то SolidWorks считает контур эскиза не замкнутым (это в том месте где я отключаю привязку swModel.SetInferenceMode(false); При включенной привязке у меня линия просто соединяется с соседней точкой.) А когда "тянешь за точку" или открываешь меню элемента «Повернутая бобышка/основание» то после этого он автоматически становиться замкнутым... Не понятно почему так происходит я ведь после отключения привязок включил полное определение эскиза...

 

 

swModel.SketchManager.FullyDefineSketch(true, true, (int)swSketchFullyDefineRelationType_e.swSketchFullyDefineRelationType_Vertical | (int)swSketchFullyDefineRelationType_e.swSketchFullyDefineRelationType_Horizontal | (int)swSketchFullyDefineRelationType_e.swSketchFullyDefineRelationType_Concentric | (int)swSketchFullyDefineRelationType_e.swSketchFullyDefineRelationType_Coincident,, true, 1, 6, 1, 6, -1, -1);
Изменено пользователем seredga
Ссылка на сообщение
Поделиться на других сайтах
что мешает Вам закрыть эскиз, и потом строить тело?

 

maxfox, ничего не мешает, я пробовал, этот приём тоже не работает.

Я подозреваю, что контур у меня не замкнутый, хотя все линии соединены и между ними привязки...

А разрывается контур, как мне кажется, в месте, где я отключаю привязку swModel.SetInferenceMode(false) до swModel.SetInferenceMode(true) .

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

maxfox, ничего не мешает, я пробовал, этот приём тоже не работает.

Я подозреваю, что контур у меня не замкнутый, хотя все линии соединены и между ними привязки...

А разрывается контур, как мне кажется, в месте, где я отключаю привязку swModel.SetInferenceMode(false) до swModel.SetInferenceMode(true) .

Странно. просто я накидал себе простой пример - у меня всё работает.:

IPartDoc^ curPart = (IPartDoc^)curDoc;
curDoc->ClearSelection2(true);
curDoc->Extension->SelectByID2(L"Спереди", L"PLANE", 0, 0, 0, false, 0, nullptr, 0);

ISketchManager ^sMan =  curDoc->SketchManager;
curDoc->IActiveView->EnableGraphicsUpdate = false;

sMan->InsertSketch(false);
ISketch^ cEketch = sMan->ActiveSketch;
IFeature^ skReat = (IFeature^)cEketch;
String^ skName = skReat->Name;
listBox1->Items->Add( "name : " + skName );

sMan->CreateLine(0, 0, 0, 0, 0.066645, 0);
sMan->CreateLine(0, 0.066645, 0, 0.054771, 0.052345, 0);
sMan->CreateLine(0.054771, 0.052345, 0, 0.054771, 0.023747, 0);
sMan->CreateLine(0.054771, 0.023747, 0, 0, 0, 0);

sMan->InsertSketch(true);

curDoc->ClearSelection2(true);
curDoc->Extension->SelectByID2( skName , L"SKETCH", 0, 0, 0, true, 0, nullptr, 0);
curDoc->Extension->SelectByID2(L"Line1@"+ skName, L"EXTSKETCHSEGMENT", 0, 0, 0, true, 16, nullptr, 0);

IFeature^newFeat =  (IFeature^)curDoc->FeatureManager->FeatureRevolve2(true, true, false, false, false, false,
			0, 0, 6.2831853071796, 0, false, false, 0.001, 0.001, 0, 0, 0, true, true, true);

curDoc->IActiveView->EnableGraphicsUpdate = true;

Сложно дать какой то дельный совет, когда размыта цель такой последовательности действий. а зачем нужна команда SetInferenceMode?

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

Команда SetInferenceMode - нужна для отключения привязок при построении эскиза. Иначе если не отключить эту настройку то ближайшие точки у меня сливаются.

Последовательность действий:

1. Создаётся эскиз

                                 3 ____________4

                                  /   1 ________2 \            |

                                  |    |                |    |           |

                                  |__|                |__|           |

 

2. методом поворота строиться тело вращения.

Без метода SetInferenceMode - внутренние точки 1 и 2 сливаются с точками 3 и 4. Расстояние между точками 1 и 3, 2 и 4 равно 1.5 мм.

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

на столько микроскопические размеры в эскизе?

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

Part.SketchAddConstraints "sgMERGEPOINTS"

как второй вариант - рисовать эскиз большой, а потом его уменьшить.

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

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

9282417f1f30.png

Возникает или при ребилдинге или когда меняются размеры. Если нажать "да", то все работает нормально. Проблема в том, что нажимать приходится раз 50 по ходу работы программы. Изменить каким-либо образом модель, чтобы эти сообщения не возникали не получилось. Может кто-нибудь знает как от них избавиться?

Я попробовал отловить это окно и нажать на "да" средствами виндоус. Но пока не разобрался до конца как это сделать. Делаю так:

Module Осн

 Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
 Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildWindow As Long, ByVal lpClassName As String, ByVal lpsWindowName As String) As Long
Const BM_CLICK = &HF5
Const WM_LBUTTONDOWN = &H201
Const WM_LBUTTONUP = &H202
Const WM_COMMAND = 273

 Sub закрыть_окно()
   Dim hwnd As Long
   hwnd = FindWindow(vbNullString, "SolidWorks") 'окно находит (получается его подвинуть и т.д.)
   hwnd = FindWindowEx(hwnd, vbNull, "Button", "Да") 'похоже не находит кнопку "да"

   SendMessage(hwnd, BM_CLICK, 0, 0)  '1 способ нажать (не работает)
   SendMessage(hwnd, WM_LBUTTONDOWN, 0, 0) '2 способ нажать (не работает)
   SendMessage(hwnd, WM_LBUTTONUP, 0, 0)   
 End Sub

 Sub закрыть_окно_2()'пытаюсь понять как это сделать через WM_COMMAND
    Dim hwnd As Long
   hwnd = FindWindow(vbNullString, "SolidWorks") 
   SendMessage(hwnd, WM_COMMAND, ???????, ?????) 'но что здесь писать?
 End Sub

End Module

То есть, окно получилось найти, а как нажать на "Да"? Может кто знаком WinApi.

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

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

п.с. вот только у меня только 1 раз при открывании оно возникало. И дальше только при следующем открывании..

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

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

п.с. вот только у меня только 1 раз при открывании оно возникало. И дальше только при следующем открывании..

Но у меня вообще точек нет в имени переменных. При чем удивительно, что на одном компе не возникает сообщения, а на другом их куча, хотя файл модели один и лежит в сети и путь к нему со всем компов одинаковый. Ну да, у меня тоже при открытии возникает, только моделей открывается много разных  и каждый раз приходится нажимать. А если открывать в режиме Silent, то при открытии не будет сообщения, но оно будет при дальнейшем перестроении модели, изменении параметров и т.д.

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

Добрый день, Вопрос. Возможно ли макросом, сделанным в встроенном редакторе VBA (будет иметь свой интерфейс), находясь в сборке, получить список деталей этой сборки в текущей конфигурации, открыть свойства детали-конфигурации, входящей в эту сборку, и прописать туда расчетные данные, выполненные этим же макросом (сами свойства без данных у детали уже будут) и сохранить деталь?

 

второй вопрос, зачем ставить Visual Studio , в нем удобнее делать приложения, по сравнения со встроенным редактором VBA?

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

1. Да

2. Visual Studio - это морока. Для программистов или тех, кто считается к ним причастным)) Для всех остальных достаточно VBA. Самого VBA вы в Visual Studio не увидите.

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

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

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

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

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

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

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

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

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

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

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



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