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

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

Поясните пожалуйста:

Выбор делаю с помощью "PropertyManagerPageSelectionbox"

На кнопку поставил:

 

Private Sub PropertyManagerPage2Handler9_OnButtonPress(ByVal Id As Long)
 
Dim swSelMgr                     As SldWorks.SelectionMgr
 
Dim swBody                        As SldWorks.Body2
 
Dim i                                    As Integer
 
Dim swError                       As Long
 
Dim BazaMat                 As String
 
Dim NameMat                 As String
 
BazaMat = "solidworks materials.sldmat"
 
NameMat = "Клен" ' ЛЮБОЙ МАТЕРИАЛ
 
Set swSelMgr = swModel.SelectionManager
 
For i = 1 To swSelMgr.GetSelectedObjectCount2(-1)
 
Set swSelMgr = swModel.SelectionManager
 
Set swBody = swSelMgr.GetSelectedObject6(i, -1)
 
swError = swBody.SetMaterialProperty("", BazaMat, NameMat)
 
Next i
 
End Sub
 
В открытом файле сборки не работает. В детали Да. 
Изменено пользователем maikl_lug
Ссылка на сообщение
Поделиться на других сайтах


Ребята есть часть кода:

swModel = ((IModelDoc2)(swApp.NewDocument("C:\\Solidworks Library\\templates\\Сборка.asmdot", 0, 0, 0)));
swModel = ((IModelDoc2)(swApp.ActivateDoc2("Assem1", false, longstatus)));
swAssembly = ((AssemblyDoc)(swModel));
swAssembly.InsertNewPart2(textBox2.Text, selectFace());

Где textBox2.Text:

private void button3_Click(object sender, EventArgs e)
        {
            Stream myStream;
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();

            saveFileDialog1.Filter = "sldWork files (*.sldprt)|*.sldprt|All files (*.*)|*.*";
            saveFileDialog1.FilterIndex = 1;
            saveFileDialog1.RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if ((myStream = saveFileDialog1.OpenFile()) != null)
                {
                    // Code to write the stream goes here.
                    textBox2.Text = saveFileDialog1.FileName;
                    myStream.Close();
                }
            }
        }

selectFace()

private object selectFace()
        {

            String assyName = swModel.GetTitle().ToLower().Contains(".sldasm")
                          ? swModel.GetTitle().Remove(swModel.GetTitle().LastIndexOf("."))
                          : swModel.GetTitle();

            for (int i = 0; i < 100; i++)
            {
                Boolean bRet = swModel.Extension.SelectByID2(partNameNumber1 + "-" + i.ToString() + "@" + assyName, "COMPONENT", 0, 0, 0, false, 0, null, 0);
                if (bRet)
                {
                    break;
                }
            }
            SelectionMgr swSelMgr = (SelectionMgr)swModel.SelectionManager;
            Component2 myOldComp = (Component2)swSelMgr.GetSelectedObject6(1, -1);
         
            if (myOldComp != null)
            {
                swPart = myOldComp.GetModelDoc2() as PartDoc;

                if (swPart != null)
                {
                    IEntity face = (IEntity)swPart.GetEntityByName("Number1", (int)swSelectType_e.swSelFACES);
                    if (face != null)
                    {
                        face = myOldComp.GetCorresponding(face) as IEntity;
                        face1 = face.Select4(false, null);
                    }
                }
            }
            return face1;
        } 

 

Проблема состоит в том, что при компиляции и отладке деталь так и не создается в сборке, методы button3_Click (textBox2.Text) и selectFace() передают значение в InsertNewPart2 но деталь все равно не создается... Может быть я как-то неправильно использую метод InsertNewPart2? В справке что-то ничего очевидного я не нашел...

PS Если нужно могу скинуть весь код...

Спасибо.

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

@@Almo


swAssembly.AddComponent4

И, кстати, swAssembly.InsertNewPart2 возвращает ErrorCode. Попробуйте так:

swInsertNewPartErrorCode_e errorCode = (swInsertNewPartErrorCode_e)swAssembly.InsertNewPart2(textBox2.Text, selectFace());

И посмотрите что там возвращается.

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

streamdown, а как мне в AddComponent4 запихнуть ссылку на поверхность получаемую методом selectFace() если AddComponent4 на вход принимает координаты?

@@Almo


swAssembly.AddComponent4

И, кстати, swAssembly.InsertNewPart2 возвращает ErrorCode. Попробуйте так:

swInsertNewPartErrorCode_e errorCode = (swInsertNewPartErrorCode_e)swAssembly.InsertNewPart2(textBox2.Text, selectFace());

И посмотрите что там возвращается.

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

Погодите, так вам нужно именно создать деталь в контексте сборки? Тогда с AddComponent я погорячился))

Что возвращает errorCode ? Вы попробовали как я показал? 

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

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

errorCode возвращает - swInsertNewPartError_FileAlreadyExists, это я так понимаю означает что деталь уже создана?

Хм... а не получается ли это из-за того, что метод button3_Click создает уже готовый файл с расширением sldprt а метод InsertNewPart2 пытается создать его же в свою очередь? Если так, то как бы мне запихнуть в InsertNewPart2 свой путь сохранения и имени будущей детали?

 

Погодите, так вам нужно именно создать деталь в контексте сборки? Тогда с AddComponent я погорячился))

Что возвращает errorCode ? Вы попробовали как я показал? 

 

В общем то при записи строки следующим образом

swAssembly.InsertNewPart2("C:\\Part3^Assem3.sldprt", selectFace()); 

errorCode возвращает swInsertNewPartError_FilePathEmpty а при отладке в окне солида видно значок выбора места вставки новой детали (типа курсор с зеленой галочкой) и для создания ее остается только кликнуть по уже подсвеченной (выбранной) грани... 

Как бы добавить этот клик?)

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

код у вас должен быть таким

  1. //if ((myStream = saveFileDialog1.OpenFile()) != null)
    {// Code to write the stream goes here.
    textBox2.Text = saveFileDialog1.FileName;
    //myStream.Close();}

а про выбор кромки почитайте ещё GetSpecificFeature2 

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

код у вас должен быть таким

  1. //if ((myStream = saveFileDialog1.OpenFile()) != null)
    {// Code to write the stream goes here.
    textBox2.Text = saveFileDialog1.FileName;
    //myStream.Close();}

а про выбор кромки почитайте ещё GetSpecificFeature2 

Не могу понять как применить GetSpecificFeature2 касательно моей проблемы, да и вообще честно говоря не очень понятен его смысл... Не могли бы объяснить?

PS появилась идея заменить InsertNewPart2 на InsertNewVirtualPart а уже потом ее сохранять, но все же, неужели никто не использует InsertNewPart2 ?

Спасибо.

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

Эээх, вот умеете вы заставить поработать по средам)))

Логика у вас неправильная.

Как должно быть:

- создать сборку (swApp.NewDocument)

- вставить туда деталь с вашей Face2;

- selectFace()

- InsertNewPart

 

 private void button1_Click(object sender, EventArgs e)
        {
            GetSolidworks();
//Тут создать сборку и вставить в нее деталь!!!!
            //swModel = (ModelDoc2)(swApp.NewDocument(@"D:\AddonSW\SWPlus\Шаблоны\Сборка.asmdot", 0, 0, 0));
//AddComponent("тут деталька с гранью");

            swAssembly = (AssemblyDoc)(swModel);
            Face2 rrr = selectFace();
            swInsertNewPartErrorCode_e errorCode = (swInsertNewPartErrorCode_e)swAssembly.InsertNewPart2(@"C:\oneforme.sldprt", selectFace());

        }
private Face2 selectFace()
        {


            String assyName = swModel.GetTitle().ToLower().Contains(".sldasm")
                          ? swModel.GetTitle().Remove(swModel.GetTitle().LastIndexOf("."))
                          : swModel.GetTitle();


            for (int i = 0; i < 100; i++)
            {
                Boolean bRet = swModel.Extension.SelectByID2("part" + "-" + i.ToString() + "@" + assyName, "COMPONENT", 0, 0, 0, false, 0, null, 0);
                if (bRet)
                {
                    break;
                }
            }
            SelectionMgr swSelMgr = (SelectionMgr)swModel.SelectionManager;
            Component2 myOldComp = (Component2)swSelMgr.GetSelectedObject6(1, -1);
         
            if (myOldComp != null)
            {
                swPart = myOldComp.GetModelDoc2() as PartDoc;


                if (swPart != null)
                {
                    IEntity face = (IEntity)swPart.GetEntityByName("Number1", (int)swSelectType_e.swSelFACES);
                    if (face != null)
                    {
                        face = myOldComp.GetCorresponding(face) as IEntity;
                        face.Select4(false, null);
                        Face2 retFase = (Face2)face;
                        return retFase;
                    }
                }
            }
            return null;
        } 

 

 

 

Не добавлялась новая деталь у вас потому, что вы создаёте сначала новую сборку БЕЗ своей детали и пытаетесь там в пустоте искать компонент.

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

Эээх, вот умеете вы заставить поработать по средам)))

Логика у вас неправильная.

Как должно быть:

- создать сборку (swApp.NewDocument)

- вставить туда деталь с вашей Face2;

- selectFace()

- InsertNewPart

 

 private void button1_Click(object sender, EventArgs e)
        {
            GetSolidworks();
//Тут создать сборку и вставить в нее деталь!!!!
            //swModel = (ModelDoc2)(swApp.NewDocument(@"D:\AddonSW\SWPlus\Шаблоны\Сборка.asmdot", 0, 0, 0));
//AddComponent("тут деталька с гранью");

            swAssembly = (AssemblyDoc)(swModel);
            Face2 rrr = selectFace();
            swInsertNewPartErrorCode_e errorCode = (swInsertNewPartErrorCode_e)swAssembly.InsertNewPart2(@"C:\oneforme.sldprt", selectFace());

        }
private Face2 selectFace()
        {


            String assyName = swModel.GetTitle().ToLower().Contains(".sldasm")
                          ? swModel.GetTitle().Remove(swModel.GetTitle().LastIndexOf("."))
                          : swModel.GetTitle();


            for (int i = 0; i < 100; i++)
            {
                Boolean bRet = swModel.Extension.SelectByID2("part" + "-" + i.ToString() + "@" + assyName, "COMPONENT", 0, 0, 0, false, 0, null, 0);
                if (bRet)
                {
                    break;
                }
            }
            SelectionMgr swSelMgr = (SelectionMgr)swModel.SelectionManager;
            Component2 myOldComp = (Component2)swSelMgr.GetSelectedObject6(1, -1);
         
            if (myOldComp != null)
            {
                swPart = myOldComp.GetModelDoc2() as PartDoc;


                if (swPart != null)
                {
                    IEntity face = (IEntity)swPart.GetEntityByName("Number1", (int)swSelectType_e.swSelFACES);
                    if (face != null)
                    {
                        face = myOldComp.GetCorresponding(face) as IEntity;
                        face.Select4(false, null);
                        Face2 retFase = (Face2)face;
                        return retFase;
                    }
                }
            }
            return null;
        } 

 

 

 

Не добавлялась новая деталь у вас потому, что вы создаёте сначала новую сборку БЕЗ своей детали и пытаетесь там в пустоте искать компонент.

Логика у меня была такая как вы написали, проблема как оказалось была в том, что перед вызовом InsertNewPart2 я не вызывал метод selectFace()...

Спасибо огромное за подсказку!!!!

PS когда применяется GetSpecificFeature2?))) Если можно то вкратце на пальцах)

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

Незачто.

огда применяется
 

Ну, там просто в API была ссылка на этот метод в Remarks. Надо читать.

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

Записал макрос.

Надо его немного подправить, на в програмирование не силён.

Суть макроса в следующем.

Делаем привязку к внешнему файлу, с темже именем как и сам файл, перестраиваем, сохраняем. и сохраняем в формат DXF с тем же именем как и файл, текущий вид.

 

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

 

Sub main()

Set swApp = _
Application.SldWorks

Set Part = swApp.ActiveDoc
boolstatus = Part.Extension.SelectByID2("Уравнения", "EQNFOLDER", 0, 0, 0, False, 0, Nothing, 0)
Part.ClearSelection2 True
longstatus = Part.SaveAs3("D:\Производство\43\29.DXF", 0, 0)
swPart = swApp.NewPart()
Set Part = swApp.ActiveDoc
Dim myModelView As Object
Set myModelView = Part.ActiveView
myModelView.FrameLeft = 0
myModelView.FrameTop = 22
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
swApp.ActivateDoc2 "Чертеж1 - Лист1", False, longstatus
Set Part = swApp.ActiveDoc
Set Part = swApp.ActiveDoc
Set myModelView = Part.ActiveView
myModelView.FrameLeft = 0
myModelView.FrameTop = 0
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
swApp.ActivateDoc2 "29", False, longstatus
Set Part = swApp.ActiveDoc
Dim myView As Object
Set myView = Part.CreateDrawViewFromModelView3("D:\Производство\43\29.SLDPRT", "*Текущий", 0, 0, 0)
boolstatus = Part.DeleteNamedView(*Текущий)
Part.ClearSelection2 True
End Sub

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

Всем привет. Нужно програмно изменить слой объекта чертежа. Ручками делается так: выбираю допустим размер, в менеджере слоев выбираю нужный слой. На скиншоте менеджер слоев внизу слева  https://yadi.sk/i/9c83uceGe3iNz

Примеры мне не помогли. Есть ChangeComponentLayer, не могу понять, как его использовать. Нашел так же команды swCommands_LayerProperties и swCommands_Layer_Select как приминить их тоже не понял.

Пробовал

            doc_md_ext.SelectAll(); // выделить все
            sw.Command(1151, ""); // потом выбрать слой

не помогло. Что я делаю не так?

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

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

Ну так а если sw.Command(1151, "LayerName")

Тоже как то интересовался этим вопросом. Быстро ответа не нашёл.

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

Ну так а если sw.Command(1151, "LayerName")

Тоже как то интересовался этим вопросом. Быстро ответа не нашёл.

Попробовал. Не помогло. Подставил и имя слоя, и цифру 1(в надежде что это единственный слой), и цифру 3(в надежде что есть еще два системных), и цифру 2 (на всякий случай), также вставил туда  слой как объект. Так же не помогло. Пробовал и со свойствами слоя. Может есть еще варианты?

Layer layer1;
LayerMgr doc_layer;
doc_layer = (LayerMgr)doc_model.GetLayerManager();

layer1 = doc_layer.GetLayer(textBox1.Text); // предварительно создается слой с именем из textBox1.Text и делается активным(текущим)
doc_md_ext.SelectAll();
sw.Command(1151, layer1);
Ссылка на сообщение
Поделиться на других сайтах

Заглянул в справку. Не понимаю в чём у вас проблема?

//Добавим список слоев
LayerMgr lMgr = (LayerMgr)swModel.GetLayerManager();
Object[] layers = lMgr.GetLayerList();
comboBox1.Items.AddRange(layers);


//Переместим размер на нужный слой
String currentLayerName = "AM_5";
DisplayDimension dim = (DisplayDimension)swModel.SelectionManager.GetSelectedObject6(1, -1);
Annotation myAnn = dim.GetAnnotation();
myAnn.Layer = currentLayerName;
Ссылка на сообщение
Поделиться на других сайтах

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

......

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

 

Где то так для размеров:

private void cmdNewLayer_Click(object sender, EventArgs e)
{
    SldWorks swApp = GetActiveSolidWorks();
    if (swApp == null)
        return;
    IModelDoc2 swModel = swApp.IActiveDoc2;
    if (swModel == null)
    {
        string message = "Загрузите документ SolidWorks-а!";
        MessageBox.Show(message, "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        return;
    }

    int docType = swModel.GetType();
    if (docType != (int)swDocumentTypes_e.swDocDRAWING)
    {
        string message = "Функция выполняется только с документами чертежей (*.slddrw)!";
        MessageBox.Show(message, "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        return;
    }

    ISelectionMgr swSelMgr = swModel.ISelectionManager;
    int countObj = swSelMgr.GetSelectedObjectCount();

    for (int i = 1; i <= countObj; i++)
    {
        swSelectType_e selType = (swSelectType_e)swSelMgr.GetSelectedObjectType2(i);
        switch (selType)
        {
            case swSelectType_e.swSelDIMENSIONS:
                {
                    IDisplayDimension swDisplayDimension = swSelMgr.GetSelectedObject5(i) as IDisplayDimension;
                    IAnnotation swAnnot = swDisplayDimension.IGetAnnotation();
                    swAnnot.Layer = "DIM"; // Имя слоя
                }
                break;
        }
    }
}

P.S. Опередили.

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

Спасибо Вам большое streamdown и Shvg. Помогло. Проблема была в моем не понимании, связать DisplayDimension и Annotation. DisplayDimension к стати тоже пере этим пробовал, а до Annotation так и не дошло дело.

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

Доброго времени суток.
Вкратце есть форма (см.рис1) алгоритм работы которой следующий:

post-29842-0-07622600-1422123573_thumb.jpg


1. указывается путь к фланцу с помощью кнопки "фланец"
2. нажимается кнопка "button4" которая должна считать конфигурации фланцы и "запихнуть" их в "comboBox1". 

    Реализацию кнопки button4 смотрите в спойлере ниже:
 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            if (button4_Click_Click == true) // флаг для кнопки button4, до ее нажатия button4_Click_Click = false
            {
                

                Process[] processes = Process.GetProcessesByName("SLDWORKS");

                foreach (Process process in processes)
                {
                    //Searching the sld procceses and kill them if there exist 
                    process.CloseMainWindow();
                    process.Kill();
                }
                //Starting solidWorks
                Object processSW = System.Activator.CreateInstance(System.Type.GetTypeFromProgID("SLDWORKS.Application"));
                swApp = (SldWorks)processSW;
                swApp.Visible = true;

                //Opening flange and getting of configuration
                String asd = pathOfFlange.Text;
                IModelDoc2 swModelFlange = (IModelDoc2)swApp.OpenDoc6(asd, 1, 2, "", 0, 0);
                ConfigurationManager swConfMgr = default(ConfigurationManager);
                swConfMgr = (ConfigurationManager)swModelFlange.ConfigurationManager;
                object[] configNameArr = null;
                configNameArr = (object[])swModelFlange.GetConfigurationNames();


                foreach (String flangeConf in configNameArr)
                {
                    
                    comboBox1.Items.Add(flangeConf);
                    int comLength = comboBox1.Items.Count;
                    int confLength = configNameArr.Length;
                    if (comboBox1.Items.Count == configNameArr.Length)
                    {
                        break;
                    }
                    
                }
            }
            else
            {
                MessageBox.Show("Нажмите применить");
            }

3. после чего выбирается необходимая конфигурация фланца в выпадающем комбобоксе
4. создается патрубок с помощью кнопки "патрубок"
5. нажимается кнопка "выполнить" и тд...
 
Вопрос состоит в следующем:
- как бы мне разбить работу этой программы на потоки. Мне кажется необходимо пункт 2 вынести в отдельный поток, что я и сделал с помощью класса backgroundWorker, но при компиляции выскакивает ексепшн " Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'comboBox1' не из того потока, в котором он был создан". Как мне синхронизировать эти потоки (главный и бекнраунд), или быть может как-то по другому реализовать исполнение кнопки button4 . Мб есть какой то другой алгоритм получения списка конфигураций, я буду признателен за пример кода. 

Спасибо.

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

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

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

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

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

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

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

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

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

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

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




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