Jump to content

Recommended Posts

Kelny
1 час назад, Mr.Anderson сказал:

Не получается. Массив names не формируется, null.

Мой код:

Так этим кодом вы смотрите свойства в текущей сборке, где их похоже нет, а не свойства вставленных в неё компонентов.

 

До свойств файлов без их открытия может достучаться через API DocumentManager, но для этого инструмента нужен ключ от разработчиков, а для этого нужна действующая подписка на сопровождение Solidworks.

 

Вероятно нужно создать объект ModelDoc2 для моделей входящих в сборку и в этом объекте смотреть свойства. Если посмотреть свойства прямо из сборке не получается (не копался глубоко в этом), то можно открывать каждый компонент (не обязательно его при этом отображать пользователю) и смотреть свойства.

Link to post
Share on other sites


v-david

чтобы "достучаться" до свойств i-го компонента в сборке не открывая его надо прежде всего обратиться именно к нему как к компоненту (выделив его или найдя в процессе перебора всех существующих) и, как тут правильно уже указали, передать его в объектную модель ModelDoc2. И только тогда вы получите доступ к его свойствам. Т.е. нужно четко понимать, что объект "компонент" обладает свойствами "компонента сборки", а не свойствами самого исходного элемента. А вот передав его в ModelDoc2 вы как раз и получаете доступ к, если грубо, его физическим свойствам. И правильно, пустой массив свойств даст ошибку, поэтому в примере и стоит перед обращением к массиву "on error resume...". 

Насчет кучи методов. Как вы думаете, за время жизни этой программы сколько поколений программистов сменилось? И было ли у них желание разбираться с проделками предыдущих коллег? Я думаю проще было написать аналогичный кусок, чем ковыряться в ... 

Edited by v-david
Link to post
Share on other sites
nicomed
6 часов назад, Mr.Anderson сказал:

var names = swCustProp.GetNames();

сталкивался с таким, что был разница что используется .NET Framework или .NET Core (.NET).

Может еще может зависеть от заданной версии языка.

Насколько помню при ФРЕЙМВОРКЕ такое приведение типов работало норм, а при КОРЕ я делал явное приведение:

names получал как object , а потом, явно, приводил его к массиву строк.

 

 

Link to post
Share on other sites
Mr.Anderson

Спасибо большое откликнувшимся!

Суть "проблемы" состояла в следующем: надо указывать конкретное имя конфигурации, пустое поле как в примерах не прокатит.

Вместо swExtension.CustomPropertyManager("") необходимо ...CustomPropertyManager("Configuration1"). Для русскоязычной версии срабатывает CustomPropertyManager("По умолчанию"). Но лучше использовать подход с выбором текущей конфигурации, вместо имени, если конфигурация модели одна. Полный код вышел вот таким:

 

int errors   = 0;
int warnings = 0;
swApp             = (SldWorks) Activator.CreateInstance(Type.GetTypeFromProgID("SldWorks.Application"));
swApp.UserControl = false;
swApp.Visible     = true;
SolidWorks.Interop.sldworks.Frame pFrame = (SolidWorks.Interop.sldworks.Frame) swApp.Frame();
pFrame.KeepInvisible = true;//Открывать экземпляр приложения в явном виде
ModelDoc2 swModel = (ModelDoc2)swApp.OpenDoc6("Путь к детали", (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref errors, ref warnings);
 
ModelDocExtension swModelDocExt = default(ModelDocExtension);
CustomPropertyManager swCustProp = default(CustomPropertyManager);//Менеджер свойств
bool status;
string val = "";
string valout = "";
 
swModelDocExt = swModel.Extension;
Configuration config = swModel.ConfigurationManager.ActiveConfiguration;//Выбираем активную конфигурацию модели
//swCustProp = swModelDocExt.CustomPropertyManager["По умолчанию"];//Можно писать имя конфигурации таким образом
swCustProp = swModelDocExt.CustomPropertyManager[config.Name];//Автоматически выбрали имя текущей конфигурации
var names = swCustProp.GetNames();
foreach (string name in names)
{
	status = swCustProp.Get4(name, false, out val, out valout);
 
	Debug.Print(name + ": " + valout);//Выбрали именно valout - это вычисленное значение свойства, подходит для массы, например, где val покажет уже не то. name - имя свойства
	//Debug.Print("Value:                    " + val);
	//Debug.Print("Evaluated value:          " + valout);
	//Debug.Print("Up-to-date data:          " + status);
}
Link to post
Share on other sites
Mr.Anderson

А есть у кого-то стабильно работающий код по чтению спецификаций с листа (slddrw), желательно с явным сопоставлением ссылок на модели деталей? Можно сопоставление путей к файлам деталей сборки.

Найденный мной в примерах API 2018 код работает через раз и через ненужные костыли. Подозреваю, что из-за явного указания всевозможных "DrSheet" и "BomFeat" не каждая спецификация читается. Хотелось бы что-то более прозрачное типа получение таблицы, чтение строки, получение ссылки на связанную модель, получение количества.

 

DrawingDoc swDraw = default(DrawingDoc);
swDraw = (DrawingDoc)swModelSpec;
bool bIsFirstSheet = false;
bIsFirstSheet = true;
Feature swFeat = default(Feature);
BomFeature swBomFeat = default(BomFeature);
swFeat = (Feature)swModelSpec.FirstFeature();
while ((swFeat != null))
{
    string type = swFeat.GetTypeName();
    if ("DrSheet" == swFeat.GetTypeName())
    {
        XMLfile.Add("    <SHEET>");
        XMLfile.Add("        <NAME>" + swFeat.Name + "</NAME>");
        bIsFirstSheet = false;
    }
    if ("BomFeat" == swFeat.GetTypeName())
    {
        swBomFeat = (BomFeature) swFeat.GetSpecificFeature2();
        ProcessBomFeature(swApp, swModel, swBomFeat, XMLfile, Спецификация_Solid);//функция непосредственного чтения таблицы
    }
    swFeat = (Feature) swFeat.GetNextFeature();
    if ((swFeat != null))
    {
        if ("DrSheet" == swFeat.GetTypeName() & !bIsFirstSheet) { XMLfile.Add("    </SHEET>"); }
    }
}

Link to post
Share on other sites
  • 2 weeks later...

Всем экспертам привет. Подскажите пожалуйста. Мне нужно выделив заметку выйти  на объект вида модели (SldWorks.View). Заметка прикреплена к компоненту. Сам компонент я понимаю как получить. А вот с помощью какого метода выйти на вид листа чертежа мне не понятно.

Link to post
Share on other sites
v-david

Боюсь, что прямой связи заметки с видом скорее всего нет, хотя могу ошибаться. Если, конечно, заметка не ссылается на какое-либо свойство модели. Но зато у заметки есть "координаты" на листе и по ним можно попробовать найти в область какого вида она попадает. А почему вы не хотите выделить сразу вид, а не заметку?

  • Нравится 1
Link to post
Share on other sites

Спасибо.  Уже придумал как это сделать и текущую задачу закрыл. Это делается двойным перебором всех видов модели и находящихся в них прикрепленных заметках. В качестве сравнения я использовал имя заметки. А вообще, это была не задача, а подзадача. Я хотел автоматизировать довольно упоротый процесс изменения ссылки заметки с дочерней детали на ее верхний уровень узла сборки. Руками это долго, Вот как в хелпе предлагается https://help.solidworks.com/2021/russian/SolidWorks/sldworks/t_link_custom_prop_sub.htm

Link to post
Share on other sites
  • 1 month later...
Docuk1

Доброго дня! Помогите преобразовать макрос. Есть макрос в примерах:

https://help.solidworks.com/2019/english/api/sldworksapi/Get_All_Sketch_Segments_in_Drawing_Template_Example_VB.htm?verRedirect=1

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

Link to post
Share on other sites
Kelny
22.03.2024 в 17:34, Docuk1 сказал:

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

https://help.solidworks.com/2019/english/api/sldworksapi/get_lines_in_sketch_example_vb.htm?_gl=1*mdrizt*_up*MQ..*_ga*ODA2ODY1MTYxLjE3MTEyMjYzNzM.*_ga_XQJPQWHZHH*MTcxMTIyNjM3Mi4xLjEuMTcxMTIyNjQ2NC4wLjAuMA..

  • Нравится 1
Link to post
Share on other sites
Elbaro

Добрый день. Уже несколько дней пытаюсь найти на просторах инета макрос, позволяющий менять материал выделенных деталей в сборке. У меня есть макрос это делающий, но только в открытой детали, заставить его работать в сборке не получается. Может кто поделится ссылкой или часть кода? Спасибо.

Link to post
Share on other sites
nicomed
7 часов назад, Elbaro сказал:

Добрый день. Уже несколько дней пытаюсь найти на просторах инета макрос, позволяющий менять материал выделенных деталей в сборке. У меня есть макрос это делающий, но только в открытой детали, заставить его работать в сборке не получается. Может кто поделится ссылкой или часть кода? Спасибо.

Полного примера кода нет, а вообще, Вам, надо смотреть в сторону интерфейса ISelectionMgr .

Набросок кода, в какую сторону смотреть ( С# )

                SelectionMgr selectionMgr = (swApp.ActiveDoc as ModelDoc2).SelectionManager;
                int selCount = selectionMgr.GetSelectedObjectCount2(-1);
                Console.WriteLine($"Выделено {selCount} объектов.");
                
                if(selCount > 0)
                {
                    for (int i = 1; i <= selCount; i++)
                    {
                        Console.WriteLine($"obj type: {(swSelectType_e)selectionMgr.GetSelectedObjectType3(i, -1)}");
                        Component2 selComponent = selectionMgr.GetSelectedObjectsComponent(i);
                        Console.WriteLine($"comp    : {selComponent.Name2}");
                    }
                }

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

Link to post
Share on other sites
Snake 60

@Elbaro Скиньте код макроса сюда, будет время - посмотрю...

Link to post
Share on other sites
Shvg
10 часов назад, Elbaro сказал:

Добрый день. Уже несколько дней пытаюсь найти на просторах инета макрос, позволяющий менять материал выделенных деталей в сборке. У меня есть макрос это делающий, но только в открытой детали, заставить его работать в сборке не получается. Может кто поделится ссылкой или часть кода? Спасибо.

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

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

using System;
using System.Collections.Generic;

using System.Windows.Forms;

using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;

namespace ChangeMaterial
{
    public class WorkSW
    {
        SldWorks m_swApp;
        bool m_thisConfig;
        public WorkSW(SldWorks swApp, bool thisConfig)
        {
            m_swApp = swApp;
            m_thisConfig = thisConfig;
        }
        public void ChangeMaterialComponent(string pathBaseMaterial, string newMaterial) 
        {
            // pathBaseMaterial - путь или имя базы материалов
            // newMaterial - имя материала из базы
             
            ModelDoc2 swModel = m_swApp.IActiveDoc2;
            if (swModel == null)
            {
                string message = "Загрузите документ SolidWorks!";
                MessageBox.Show(message, "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            int docType = swModel.GetType();

            switch (docType)
            {
                case (int)swDocumentTypes_e.swDocPART:
                    ChangeMaterialInPart(swModel, pathBaseMaterial, newMaterial);
                    break;
                case (int)swDocumentTypes_e.swDocASSEMBLY:
                    ChangeMaterialInAssembly(swModel, pathBaseMaterial, newMaterial);
                    break;
                default:
                    {
                        string message = "Функция выполняется только с деталями (*.SLDPRT) и сборками (*.SLDASM)!";
                        MessageBox.Show(message, "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
            }
        }

        private void ChangeMaterialInAssembly(ModelDoc2 swModelAsm, string pathBaseMaterial, string newMaterial)
        {
            List<PathConfig> listPathConfig = new List<PathConfig>();

            SelectionMgr swSelMgr = swModelAsm.ISelectionManager;
            int countObj = swSelMgr.GetSelectedObjectCount();
            if (countObj > 0)
            {
                for (int i = 1; i <= countObj; i++)
                {
                    Component2 swComponent = swSelMgr.IGetSelectedObjectsComponent2(i);
                    if (swComponent != null)
                    {
                        ModelDoc2 swModelComp = swComponent.IGetModelDoc();
                        if (swModelComp == null)
                            continue;
                        if (swModelComp.GetType() != (int)swDocumentTypes_e.swDocPART)
                            continue;

                        string pathModelComp = swModelComp.GetPathName();
                        string nameConfigComp = swComponent.ReferencedConfiguration;

                        bool bExist = TestExistComponent(listPathConfig, pathModelComp, nameConfigComp);
                        if(!bExist)
                        {
                            PathConfig pathConfig = new PathConfig();
                            pathConfig.Path = pathModelComp;
                            pathConfig.NameConfig = nameConfigComp;
                            listPathConfig.Add(pathConfig);
                        }
                    }
                }
            }

            int count = listPathConfig.Count;
            if(count > 0)
            {
                int iError = -1;
                int iWarning = -1;

                for (int i = 0; i < count; i++)
                {
                    PathConfig pathConfig = listPathConfig[i];
                    string path = pathConfig.Path;
                    string nameConfig = pathConfig.NameConfig;

                    ModelDoc2 swModel = m_swApp.OpenDoc6(path, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent,
                                                        nameConfig, ref iError, ref iWarning);
                    if (swModel == null)
                        continue;
                    if (iError != 0)
                        continue;

                    Configuration swConfig = swModel.IGetActiveConfiguration();
                    string nameActiveConfig = swConfig.Name;

                    string[] arrConfig = swModel.GetConfigurationNames() as string[];
                    if (arrConfig == null)
                        continue;

                    PartDoc swPart = swModel as PartDoc;
                    ChangeMaterialInPart(swPart, pathBaseMaterial, newMaterial, nameActiveConfig, arrConfig);

                    int iSaveError = (int)swFileSaveError_e.swGenericSaveError;
                    int iSaveWarning = (int)swFileSaveWarning_e.swFileSaveWarning_RebuildError;
                    bool bres = swModel.Save3((int)swSaveAsOptions_e.swSaveAsOptions_Silent, ref iSaveError, ref iSaveWarning);

                    m_swApp.CloseDoc(path);
                }
            }
        }

        private bool TestExistComponent(List<PathConfig> listTest, string path, string nameConfig)
        {
            for (int i = 0; i < listTest.Count; i++)
            {
                PathConfig pathConfig = listTest[i];
                string pathTemp = pathConfig.Path;
                string nameConfigTemp = pathConfig.NameConfig;
                if(string.Compare(path, pathTemp, true) == 0)
                {
                    if(string.Compare(nameConfig, nameConfigTemp, true) == 0)
                    {
                        return true;
                    }
                }
            }
            return false;
        }

        private void ChangeMaterialInPart(ModelDoc2 swModel, string pathBaseMaterial, string newMaterial)
        {
            IConfiguration swConfig = swModel.IGetActiveConfiguration();
            string nameActiveConfig = swConfig.Name;

            string[] arrConfig = swModel.GetConfigurationNames() as string[];
            if (arrConfig == null)
                return;            

            PartDoc swPart = swModel as PartDoc;
            ChangeMaterialInPart(swPart, pathBaseMaterial, newMaterial, nameActiveConfig, arrConfig);

            int iSaveError = (int)swFileSaveError_e.swGenericSaveError;
            int iSaveWarning = (int)swFileSaveWarning_e.swFileSaveWarning_RebuildError;
            bool bres = swModel.Save3((int)swSaveAsOptions_e.swSaveAsOptions_Silent, ref iSaveError, ref iSaveWarning); // после изменения материала сохранение файла детали.

        }

        private void ChangeMaterialInPart(PartDoc swPart, string pathBaseMaterial, string newMaterial, string nameActiveConfig, string[] arrConfig)
        {
            try
            {
                if (m_thisConfig) // материал меняется только у текущей конфигурация
                {
                    swPart.SetMaterialPropertyName2(nameActiveConfig, pathBaseMaterial, newMaterial);
                }
                else // материал меняется у всех конфигурация
                {
                    swPart.SetMaterialPropertyName2(nameActiveConfig, pathBaseMaterial, newMaterial);
                    for (int j = 0; j < arrConfig.Length; j++)
                    {
                        string tempConfig = arrConfig[j];
                        if (tempConfig.ToLower() != nameActiveConfig.ToLower())
                        {
                            swPart.SetMaterialPropertyName2(tempConfig, pathBaseMaterial, newMaterial);

                        }
                    }
                }
            }
            catch { }
        }
    }
}

public class PathConfig
{
    public string Path;
    public string NameConfig;
}

 

 

Link to post
Share on other sites
Elbaro
29.03.2024 в 23:25, Shvg сказал:

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

  Показать содержимое


using System;
using System.Collections.Generic;

using System.Windows.Forms;

using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;

namespace ChangeMaterial
{
    public class WorkSW
    {
        SldWorks m_swApp;
        bool m_thisConfig;
        public WorkSW(SldWorks swApp, bool thisConfig)
        {
            m_swApp = swApp;
            m_thisConfig = thisConfig;
        }
        public void ChangeMaterialComponent(string pathBaseMaterial, string newMaterial) 
        {
            // pathBaseMaterial - путь или имя базы материалов
            // newMaterial - имя материала из базы
             
            ModelDoc2 swModel = m_swApp.IActiveDoc2;
            if (swModel == null)
            {
                string message = "Загрузите документ SolidWorks!";
                MessageBox.Show(message, "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            int docType = swModel.GetType();

            switch (docType)
            {
                case (int)swDocumentTypes_e.swDocPART:
                    ChangeMaterialInPart(swModel, pathBaseMaterial, newMaterial);
                    break;
                case (int)swDocumentTypes_e.swDocASSEMBLY:
                    ChangeMaterialInAssembly(swModel, pathBaseMaterial, newMaterial);
                    break;
                default:
                    {
                        string message = "Функция выполняется только с деталями (*.SLDPRT) и сборками (*.SLDASM)!";
                        MessageBox.Show(message, "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
            }
        }

        private void ChangeMaterialInAssembly(ModelDoc2 swModelAsm, string pathBaseMaterial, string newMaterial)
        {
            List<PathConfig> listPathConfig = new List<PathConfig>();

            SelectionMgr swSelMgr = swModelAsm.ISelectionManager;
            int countObj = swSelMgr.GetSelectedObjectCount();
            if (countObj > 0)
            {
                for (int i = 1; i <= countObj; i++)
                {
                    Component2 swComponent = swSelMgr.IGetSelectedObjectsComponent2(i);
                    if (swComponent != null)
                    {
                        ModelDoc2 swModelComp = swComponent.IGetModelDoc();
                        if (swModelComp == null)
                            continue;
                        if (swModelComp.GetType() != (int)swDocumentTypes_e.swDocPART)
                            continue;

                        string pathModelComp = swModelComp.GetPathName();
                        string nameConfigComp = swComponent.ReferencedConfiguration;

                        bool bExist = TestExistComponent(listPathConfig, pathModelComp, nameConfigComp);
                        if(!bExist)
                        {
                            PathConfig pathConfig = new PathConfig();
                            pathConfig.Path = pathModelComp;
                            pathConfig.NameConfig = nameConfigComp;
                            listPathConfig.Add(pathConfig);
                        }
                    }
                }
            }

            int count = listPathConfig.Count;
            if(count > 0)
            {
                int iError = -1;
                int iWarning = -1;

                for (int i = 0; i < count; i++)
                {
                    PathConfig pathConfig = listPathConfig[i];
                    string path = pathConfig.Path;
                    string nameConfig = pathConfig.NameConfig;

                    ModelDoc2 swModel = m_swApp.OpenDoc6(path, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent,
                                                        nameConfig, ref iError, ref iWarning);
                    if (swModel == null)
                        continue;
                    if (iError != 0)
                        continue;

                    Configuration swConfig = swModel.IGetActiveConfiguration();
                    string nameActiveConfig = swConfig.Name;

                    string[] arrConfig = swModel.GetConfigurationNames() as string[];
                    if (arrConfig == null)
                        continue;

                    PartDoc swPart = swModel as PartDoc;
                    ChangeMaterialInPart(swPart, pathBaseMaterial, newMaterial, nameActiveConfig, arrConfig);

                    int iSaveError = (int)swFileSaveError_e.swGenericSaveError;
                    int iSaveWarning = (int)swFileSaveWarning_e.swFileSaveWarning_RebuildError;
                    bool bres = swModel.Save3((int)swSaveAsOptions_e.swSaveAsOptions_Silent, ref iSaveError, ref iSaveWarning);

                    m_swApp.CloseDoc(path);
                }
            }
        }

        private bool TestExistComponent(List<PathConfig> listTest, string path, string nameConfig)
        {
            for (int i = 0; i < listTest.Count; i++)
            {
                PathConfig pathConfig = listTest[i];
                string pathTemp = pathConfig.Path;
                string nameConfigTemp = pathConfig.NameConfig;
                if(string.Compare(path, pathTemp, true) == 0)
                {
                    if(string.Compare(nameConfig, nameConfigTemp, true) == 0)
                    {
                        return true;
                    }
                }
            }
            return false;
        }

        private void ChangeMaterialInPart(ModelDoc2 swModel, string pathBaseMaterial, string newMaterial)
        {
            IConfiguration swConfig = swModel.IGetActiveConfiguration();
            string nameActiveConfig = swConfig.Name;

            string[] arrConfig = swModel.GetConfigurationNames() as string[];
            if (arrConfig == null)
                return;            

            PartDoc swPart = swModel as PartDoc;
            ChangeMaterialInPart(swPart, pathBaseMaterial, newMaterial, nameActiveConfig, arrConfig);

            int iSaveError = (int)swFileSaveError_e.swGenericSaveError;
            int iSaveWarning = (int)swFileSaveWarning_e.swFileSaveWarning_RebuildError;
            bool bres = swModel.Save3((int)swSaveAsOptions_e.swSaveAsOptions_Silent, ref iSaveError, ref iSaveWarning); // после изменения материала сохранение файла детали.

        }

        private void ChangeMaterialInPart(PartDoc swPart, string pathBaseMaterial, string newMaterial, string nameActiveConfig, string[] arrConfig)
        {
            try
            {
                if (m_thisConfig) // материал меняется только у текущей конфигурация
                {
                    swPart.SetMaterialPropertyName2(nameActiveConfig, pathBaseMaterial, newMaterial);
                }
                else // материал меняется у всех конфигурация
                {
                    swPart.SetMaterialPropertyName2(nameActiveConfig, pathBaseMaterial, newMaterial);
                    for (int j = 0; j < arrConfig.Length; j++)
                    {
                        string tempConfig = arrConfig[j];
                        if (tempConfig.ToLower() != nameActiveConfig.ToLower())
                        {
                            swPart.SetMaterialPropertyName2(tempConfig, pathBaseMaterial, newMaterial);

                        }
                    }
                }
            }
            catch { }
        }
    }
}

public class PathConfig
{
    public string Path;
    public string NameConfig;
}

 

 

Спасибо большое, НО есть какая-нибудь возможность его перевести на VBA? Я хочу его вставить в свой макрос.

Link to post
Share on other sites
Elbaro

@Snake 60 

 

 

Sub main()

    Dim swApp       As SldWorks.SldWorks

    Dim Part             As SldWorks.ModelDoc2

    Dim longstatus  As Long, longwarning As Long

    Dim boolstatus  As Boolean

    Dim macrfolder  As String

    Dim Materiaal   As String

   

    Set swApp = Application.SldWorks

    macrofolder = swApp.GetCurrentMacroPathFolder() & "\"

    Materiaal = "AISI 304"

   

    swApp.DocumentVisible False, swDocPART

   

    Set Part = swApp.OpenDoc6("part.SLDPRT", swDocPART, swOpenDocOptions_Silent, "", longstatus, longwarning)

    'Set Part = swApp.ActivateDoc2("part", True, longstatus)

   

    Part.SetMaterialPropertyName2 "По умолчанию", "C:/Program Files/SOLIDWORKS Corp/SOLIDWORKS/lang/english/sldmaterials/SOLIDWORKS Materials.sldmat", Materiaal

    swApp.DocumentVisible True, swDocPART

    swApp.CloseDoc "part"

   

End Sub
 

Link to post
Share on other sites
  • 3 weeks later...
alek77

Всем привет!

Коллеги, прошу помочь, не смог разобраться.

 

Пытаюсь макросом из сборки вытянуть свойства пользователя компонента с несколькими конфигурациями.

Если свойства прописаны явным образом (например: Наименование - Овечка белая) - никаких проблем нет, что на вкладке пользователя, что на вкладке конфигурации. Всегда все считывается корректно.

Если свойство пользователя на вкладке пользователя прописано не явно (например: Наименование - $PRP:"SW-File Name" $PRP:"SW- Имя конфигурации(Configuration Name)"), то при считывании всегда Наименование считывается как при последнем открытии файла компонента, не зависимо от того, что конфигурация для считывания другая. То есть открывал последней конфигурацию компонента Желтая, так и получаю для всех компонентов в Наименовании Овечка Желтая, а не синяяя и не черная.

 

image.png

Пример и код прилагаются.

Вставил в сборку 4 разных конфигурации, а при считывании Наименования всегда получаю последнюю открытую конфигурацию.

Посмотрите пожалуйста, что может быть не так?

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

Наименование компонента при выводе не соответсвует конфигурации.

Если конфигурация называется Белая, то и наименование должно быть Овечка Белая, а не желтая, и не синяя, и не черная.

 

image.png

 

Открыть сборку, открыть макрос на редактирование, запустить, проверить Immediat.

 

000 Test.7z

Link to post
Share on other sites
v-david

Вы выбрали конфигурацию, но не активировали ее:

 

    Set swCustPropMgr = CmpDoc.Extension.CustomPropertyManager(CompConfig)
'-------------------------------------------------------------------------------
lRetVal = CmpDoc.ShowConfiguration2(CompConfig)
'-------------------------------------------------------------------------------
    lRetVal = swCustPropMgr.Get4("Наименование", False, Val, ValOut)
    If ValOut = Empty Then
        Set swCustPropMgr = CmpDoc.Extension.CustomPropertyManager("")
        lRetVal = swCustPropMgr.Get4("Наименование", False, Val, ValOut)

Edited by v-david
  • Нравится 1
  • Чемпион 2
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.



  • Сообщения

    • Guhl
      Что значит в состоянии разгона? То есть в разнос уходит? Вот когда один ключ не работает, то будет ситуация, что мотор не может достичь заданной скорости и растет нагрузка
    • Guhl
      Я открывал его, выглядит судя по фоткам в инете как оригинал. Микросхемы, плата Чтобы образ снять и пароль вытянуть
    • gudstartup
      Ключи здесь ни причем просто усилитель находится в режиме постоянного разгона до заданной скорости а достичь ее е может   отсюда и нагрузка в 150%
    • gudstartup
      А для чего он нужен например в 828D? цена оригинала выше в 10 раз а у нас не было случаев чтобы  не подключился просто у оригиналов скорость обмена может быть более 1.5 МБит и если связь в контроллере настроена на более высокую скорость то может и не соединиться  тоже игрушка для толстосумов да и зачем она если можно в проц. воткнуть и прочитать?
    • Maker79
      Мне будет очень интересно!
    • maxx2000
      @Maker79 именно так. Не нравится делать всю работу за программу, обрабатывай 3D модель. Есть другие хорошие CAM которые умеют накладывать плоский шаблон на любую криволинейную поверхность 
    • Maker79
      Следуя этому смыслу нужно создать шаблон учитывая диаметр фрезы и смещение, то-есть сделать всю работу за программу и положить ей в рот чтобы она прожевала? 
    • Viktor2004
      Щас как-то нет времени вникать в эту тему. Может тут проблема как у меня когда-то была?   вот еще    
    • Guhl
      Ну меня настрощали, что не всегда удается подключиться. Может конечно это и неправда, но с оригиналом всегда спокойнее. ММС читаются обычным внешним программатором  А вот для MC карт (или как там они называются) есть сименсовский ридер  
    • boomeeeer
      я китайским за 3к без проблем цепляюсь к этой ЧПУхе
×
×
  • Create New...