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

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

Получается так, что примитивы эскиза, в частности дуги,  не имеют свойства длины. И её надо вычислять. Это так?

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


Здравствуйте,
 
Можно находить через кривые (ICurve::GetLength), где ICurve->ISketchSegment::GetCurve, но кривые  у примитивом неусеченные (untrimmed). Поэтому их изначально нужно усекать на конечных точках методом ICurve::TrimCurve, а для этого у каждого примитива нужно брать такие ::StartPoint/::EndPoint
 
Второй вариант использовать инструмент IMeasure. Вот пример, который работает для выделенного сегмента и выводит сообщение о длине в метрах
 
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr

Sub main()

    Set swApp = Application.SldWorks
        
    Set swModel = swApp.ActiveDoc
    
    Set swSelMgr = swModel.SelectionManager
    
    Dim swSeg(0) As SldWorks.SketchSegment
    
    Set swSeg(0) = swSelMgr.GetSelectedObject6(1, -1)
    
    Dim swMeasure As SldWorks.Measure
    
    Set swMeasure = swModel.Extension.CreateMeasure()
    swMeasure.Calculate swSeg
    
    Dim length As Double
    length = swMeasure.length
    
    If length = -1 Then
        length = swMeasure.ArcLength
    End If
    
    MsgBox length
        
End Sub
 

 

artem_cad, streamdown, поведайте по каким источникам изучаете VBA SW?

 

Мне пока удалось найти только  Automating SolidWorks with VBA от CADSharp LLC.

В природе есть ещё литература по VBA SW?

 

В основном это справка SolidWorks API, Других ресурсов я не находил. SolidWorks предоставляет достаточно хороший вводный курс SolidWorks API Fundamentals, но он доступен только через реселлера. В моей подписи есть пару ссылок на мои ресурсы, также официальный форум SolidWorks. В группе можно писать на русском, а насчет видео, оно на английском и в основном для языка c#, но если есть интерес, то могу добавить русские субтитры.
 
~A.
 
Ссылка на сообщение
Поделиться на других сайтах
~A.
 ах вооот что за Артём  :smile:  Приятно видеть специалиста такого уровня на редком русскоязычном форуме по API SW.
Ссылка на сообщение
Поделиться на других сайтах

Добрый день.

Всем огромное спасибо за помощь, кто отозвался на мои темы.

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

Остался один не решенный вопрос.

Подскажите как открыть файл в фоновом режиме (что бы он не выводился на экран). А то при переборе и открытии всех деталей сборки. Они все поочереди выводятся на экран а потом закрывается, это конечно все происходит очень быстро. Но хотелось бы избавится от этого.

Вот часть кода для открытия

 

Set Part = swApp.ActivateDoc2(pgFileNames(i), False, longstatus)
Set swModel2 = swApp.ActiveDoc
Ссылка на сообщение
Поделиться на других сайтах

Добрый День,

Вам в данном случае нет необходимости открывать файлы. Неоходимо только убедиться, что Ваши компоненты полностью оперделены: Component2::GetSuppression=swComponentResolved. Если так, то можно брать указатель на модель через IComponent2::GetModelDoc2 и уже в нем перебирать дерево. Также можете перебирать дерево непосредственно в контексте сборки. Необходимо поменять IModelDoc2::FirstFeature на IComponent2::FirstFeature.

 

РЕДАКТИРОВАНО. Вспомнил, что Вы собираете файлы по путям, а не из дерева. Но в таком случае, они уже тоже загружены, только невидимы. Можете либо получить указатель по имени: SldWorks::GetOpenDocumentByName либо вызвать 

 

swApp.DocumentVisible False, swDocumentTypes_e.swDocPART
swApp.OpenDoc6 ...
swApp.DocumentVisible False, swDocumentTypes_e.swDocPART

Я бы посоветовал использовать ISldWorks::OpenDoc6 вместо ActivateDoc. Если докумен находиться в режиме lightweight, то этот способ загрузит документ, иначе он просто подключится к уже загруженному.

 

~A.

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

 

Здравствуйте,
 
Можно находить через кривые (ICurve::GetLength), где ICurve->ISketchSegment::GetCurve, но кривые  у примитивом неусеченные (untrimmed). Поэтому их изначально нужно усекать на конечных точках методом ICurve::TrimCurve, а для этого у каждого примитива нужно брать такие ::StartPoint/::EndPoint
 
Второй вариант использовать инструмент IMeasure. Вот пример, который работает для выделенного сегмента и выводит сообщение о длине в метрах
....

 

В основном это справка SolidWorks API, Других ресурсов я не находил. SolidWorks предоставляет достаточно хороший вводный курс SolidWorks API Fundamentals, но он доступен только через реселлера. В моей подписи есть пару ссылок на мои ресурсы, также официальный форум SolidWorks. В группе можно писать на русском, а насчет видео, оно на английском и в основном для языка c#, но если есть интерес, то могу добавить русские субтитры.
 
~A.
 

 

Спасибо, Артём!

 

Получается так, что один и тот же примитив (дуга на пример) может быть как  "Arc" и "Curve"?

:blink: .  Может я  не так понял?

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

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

 ах вооот что за Артём  :smile:  Приятно видеть специалиста такого уровня на редком русскоязычном форуме по API SW.

 

Спасибо за такую оценку :smile: . А форум, пожалуй, единственный русскоязычный ресурс (да, и еще Ваш сайт). И я должен сказать по активности может посоперничать с официальным форумом SolidWorks.

 

Спасибо, Артём!

 

Получается так, что один и тот же примитив (дуга на пример) может быть как  "Arc" и "Curve"?

:blink: .  Может я  не так понял?

 

 

Примитивы типа SketchArc, SketchLine, SketchPrabola…  - это модель, которая определяет «внешний вид» объекта (например цвет), а ICurve – это математическое представление. Точно так же как и кромка – это внешний вид (IEdge), а ICurve – математика.  Т.е., когда вы видите окружность на чертеже – это SketchArc, но все его данные (положение, начальные точки, радиус) описаны в интерфейсе ICurve.

 

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

 

Да можно. Но тут будет необходимо добавлять форму, чтобы макрос мог остановиться. К сожалению сообщения типа MsgBox будет блокировать окно SolidWorks и Вы не сможете ничего выделить. Самый простой вариант – это сразу выделить несколько объектов и считать, что первый – дуга, которую нужно изменить, 2й до последнуго – группа дуг. Но лучше всего для такой задачи подойдет стандартная страница SolidWorks (можно создать свою страницу и использовать SelectionBox для выбора). Пример создания страницы: http://help.solidworks.com/2012/English/api/swpublishedapi/Create_PropertyManager_Page_Example_vb.htm.

 

~A.

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

Класс!

Огромное спасибо, Артём! 

 

Ещё вопрос. А можно ли узнать, что на примитив, на пример нашу дугу, наложен размер. И если можно выяснить, что наложенный размер это длины дуги, то варьировать его с целью подбора?

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

@@artem_cad, , на американском форуме спрашивал, там "послали" по неверному пути. Да и сам неверно нашёл решение.

Можно ли в Solidworks получить Face Center (Centroid) БЕЗ выделения поверхности?  Ибо очень ресурсозатратная операция, даже с выключенным EnableGraphicsUpdate. К примеру, я пробежкой нашёл нужную поверхность. У меня есть её объект, теперь надо найти центр поверхности.

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

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

Подскажите пожалуйста, как при помощи макроса, вставить строку в таблицу спецификации?

Вроде все просто, но ничего не происходит...

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

Добрый День,

Вам в данном случае нет необходимости открывать файлы. Неоходимо только убедиться, что Ваши компоненты полностью оперделены: Component2::GetSuppression=swComponentResolved. Если так, то можно брать указатель на модель через IComponent2::GetModelDoc2 и уже в нем перебирать дерево. Также можете перебирать дерево непосредственно в контексте сборки. Необходимо поменять IModelDoc2::FirstFeature на IComponent2::FirstFeature.

 

РЕДАКТИРОВАНО. Вспомнил, что Вы собираете файлы по путям, а не из дерева. Но в таком случае, они уже тоже загружены, только невидимы. Можете либо получить указатель по имени: SldWorks::GetOpenDocumentByName либо вызвать 

 

swApp.DocumentVisible False, swDocumentTypes_e.swDocPART
swApp.OpenDoc6 ...
swApp.DocumentVisible False, swDocumentTypes_e.swDocPART

Я бы посоветовал использовать ISldWorks::OpenDoc6 вместо ActivateDoc. Если докумен находиться в режиме lightweight, то этот способ загрузит документ, иначе он просто подключится к уже загруженному.

 

~A.

Спасибо огромное.

Но я еще новичок. По вашему совету сделал но возникла другая проблема:

 

Вот код main

 

Sub main()
    Set swApp = _
    Application.SldWorks


    Set swModel = swApp.ActiveDoc
    boolstatus = swModel.EditRebuild3()
    openFileDr = swModel.GetPathName
    openFile = Replace(openFileDr, ".SLDDRW", ".SLDASM")
    Set swModelDoc = swApp.OpenDoc6(openFile, swDocASSEMBLY, swOpenDocOptions_Silent, "", errors, warnings)
    If errors > 0 Then
        MsgBox ("Файл чертежа должен иметь такое же имя как и файл сборки. Переименуйте файл чертежа или перейдите в общуюю сборку и перезапустите макрос")
        Exit Sub
    End If
        Set swModelDocExt = swModelDoc.Extension
    Set swPackAndGo = swModelDocExt.GetPackAndGo 'Get Pack and Go object
    namesCount = swPackAndGo.GetDocumentNamesCount
    status = swPackAndGo.GetDocumentNames(pgFileNames)
    If (Not (IsEmpty(pgFileNames))) Then
        For i = 0 To UBound(pgFileNames)
            det = InStr(pgFileNames(i), ".sldprt")
                If det > 0 Then
                    swApp.DocumentVisible False, swDocumentTypes_e.swDocPART


                    swApp.OpenDoc6 pgFileNames(i), swDocASSEMBLY, swOpenDocOptions_Silent, "", errors, warnings
                    'Set Part = swApp.ActivateDoc2(pgFileNames(i), False, longstatus)
                    
                    swApp.DocumentVisible False, swDocumentTypes_e.swDocPART
                    
                    Set swModel2 = swApp.ActiveDoc
                    ConfigName = GetCurrentConfigName()
                    CatList = ReadCatList()
                    swApp.CloseDoc pgFileNames(i)
                End If
        Next i
    End If
    statuses = swModelDocExt.SavePackAndGo(swPackAndGo) ' Pack and Go
    boolstatus = swModel.EditRebuild3()
End Sub


Function ReadCatList()
  
Set Part = swApp.ActiveDoc
Set sMgr = Part.SelectionManager
Set cpMgr = Part.Extension.CustomPropertyManager("")
boolstatus = Part.Extension.SelectByID2("Sheet<1>", "SUBWELDFOLDER", 0, 0, 0, False, 0, Nothing, 0)
boolstatus1 = Part.Extension.SelectByID2("Элемент списка вырезов1", "SUBWELDFOLDER", 0, 0, 0, False, 0, Nothing, 0)
Set myFeature = sMgr.GetSelectedObject6(1, 0)
If boolstatus = False And boolstatus1 = False Then
   Exit Function
End If
Set SMcpMgr = myFeature.CustomPropertyManager
.....
.....
.....
End Function
 
Перестали работать строки
boolstatus = Part.Extension.SelectByID2("Sheet<1>", "SUBWELDFOLDER", 0, 0, 0, False, 0, Nothing, 0)
boolstatus1 = Part.Extension.SelectByID2("Элемент списка вырезов1", "SUBWELDFOLDER", 0, 0, 0, False, 0, Nothing, 0)

Не получает доступ к элементам списка вырезов, при закрытом файле.

Подскажите как решить эту проблему.

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

@@artem_cad, , на американском форуме спрашивал, там "послали" по неверному пути. Да и сам неверно нашёл решение.

Можно ли в Solidworks получить Face Center (Centroid) БЕЗ выделения поверхности?  Ибо очень ресурсозатратная операция, даже с выключенным EnableGraphicsUpdate. К примеру, я пробежкой нашёл нужную поверхность. У меня есть её объект, теперь надо найти центр поверхности.

 

Попробовал сделать через временные тела и центр масс, получилось в среднем увеличить результативность в 2-4 раза. Ниже код, который я использовал. Причем странно, что операция по трансформации координат в сборке занимает половину времени, хотя это достаточно простая математика. Вы можете заменить следующий код на соответсвующие формулы по трансформации:

IMathPoint pt = mathUtils.CreatePoint(new double[] { prps[0], prps[1], prps[2] }) as IMathPoint;
pt = pt.MultiplyTransform(face.Value) as IMathPoint;

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

public void Main()
        {
            IModelDoc2 model = swApp.IActiveDoc2;
 
            double[] prps = null;
            System.DateTime start;
 
            //TEST-1
            StringBuilder res1 = new StringBuilder();
            start = System.DateTime.Now;
            IMathUtility mathUtils = swApp.IGetMathUtility();
            foreach (KeyValuePair<IFace2, IMathTransform> face in TraverseFaces())
            {
                IBody2 body = face.Key.CreateSheetBody() as IBody2;
                prps = body.GetMassProperties(0) as double[];
                //slow part (increases teh time in 1.5-2 times. May be replaced with matrix calculations)
                IMathPoint pt = mathUtils.CreatePoint(new double[] { prps[0], prps[1], prps[2] }) as IMathPoint;
                pt = pt.MultiplyTransform(face.Value) as IMathPoint;
                prps = pt.ArrayData as double[];
                //
                res1.AppendFormat(string.Format("{0}{1};{2};{3}", System.Environment.NewLine, prps[0], prps[1], prps[2]));
            }
 
            string time1 = string.Format("Time (Test1): {0}", System.DateTime.Now.Subtract(start).TotalMilliseconds);
 
            //TEST-2
            StringBuilder res2 = new StringBuilder();
            start = System.DateTime.Now;
 
            foreach (KeyValuePair<IFace2, IMathTransform> face in TraverseFaces())
            {
                (face.Key as IEntity).Select4(false, null);
                prps = model.Extension.GetSectionProperties2(
                face.Key) as double[];
 
                res2.AppendFormat(string.Format("{0}{1};{2};{3}", System.Environment.NewLine, prps[2], prps[3], prps[4]));
            }
 
            string time2 = string.Format("Time (Test2): {0}", System.DateTime.Now.Subtract(start).TotalMilliseconds);
 
            model.ClearSelection2(true);
        }
 
        private IEnumerable<KeyValuePair<IFace2, IMathTransform>> TraverseFaces()
        {
            IAssemblyDoc assm = swApp.IActiveDoc2 as IAssemblyDoc;
            object[] comps = assm.GetComponents(false) as object[];
 
            foreach (IComponent2 comp in comps)
            {
                IMathTransform xForm = comp.Transform2;
 
                object bodiesInfo;
                object[] bodies = comp.GetBodies3((int) swBodyType_e.swAllBodies, out bodiesInfo) as object[];
 
                foreach (IBody2 b in bodies)
                {
                    object[] faces = b.GetFaces() as object[];
 
                    foreach (IFace2 face in faces)
                    {
                        if (face.IGetSurface().IsPlane())
                        {
                            yield return new KeyValuePair<IFace2, IMathTransform>(face, xForm);
                        }
                    }
                }
            }
        }
 
        public SldWorks swApp;

Класс!

Огромное спасибо, Артём! 

 

Ещё вопрос. А можно ли узнать, что на примитив, на пример нашу дугу, наложен размер. И если можно выяснить, что наложенный размер это длины дуги, то варьировать его с целью подбора?

 

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

 

Вот пример, который находит к чему прикреплен выделенный размер. Теперь нужно сравнить эти элементы (vEnts) с исходным примитивом. Для Вашей задачи нужно перебрать все размеры (IFeature::GetFirstDisplayDimension, IDisplayDiemnsion::GetNext5)

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swDispDim As SldWorks.DisplayDimension
Dim swAnn As SldWorks.Annotation

Sub main()

    Set swApp = Application.SldWorks
    
    Set swModel = swApp.ActiveDoc
    
    Set swSelMgr = swModel.SelectionManager
    
    Set swDispDim = swSelMgr.GetSelectedObject6(1, -1)
    
    Set swAnn = swDispDim.GetAnnotation
    
    Dim vEnts As Variant
    
    vEnts = swAnn.GetAttachedEntities3
    
    If IsEmpty(vEnts) Then
        MsgBox ("Dimension isn't linked!")
    End If
    
End Sub

~A.

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

Вот как раз это 

(face.Key as IEntity).Select4(false, null);

И давало очень продолжительное время при переборе.

 

Попробую, спасибо.

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

Кстати ещё вопрос. При переборе в сборке

(face.Key as IEntity).Select4(false, null);
 

Разве не надо GetCorrespondingEntity вызывать?

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

Кстати ещё вопрос. При переборе в сборке

 

 

 

Разве не надо GetCorrespondingEntity вызывать?

 

Не обязательно, так как IFace2 берется из компонентка в контексте сборки. GetCorresponding будeт нужен, если получать фэйсы в контексте детали, например: IComponent2::GetModelDoc2->IModelDoc2->...

 

Хотя странно, когда делаешь IFace2::CreateSheetBody, то тело возвращается в координатной системе детали, и поэтому его нужно трансформировать, хотя по логике должно быть в контексте сборки.

 

~A.

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

Спасибо огромное.

Но я еще новичок. По вашему совету сделал но возникла другая проблема:

 

Вот код main

 

Sub main()
    Set swApp = _
    Application.SldWorks


    Set swModel = swApp.ActiveDoc
    boolstatus = swModel.EditRebuild3()
    openFileDr = swModel.GetPathName
    openFile = Replace(openFileDr, ".SLDDRW", ".SLDASM")
    Set swModelDoc = swApp.OpenDoc6(openFile, swDocASSEMBLY, swOpenDocOptions_Silent, "", errors, warnings)
    If errors > 0 Then
        MsgBox ("Файл чертежа должен иметь такое же имя как и файл сборки. Переименуйте файл чертежа или перейдите в общуюю сборку и перезапустите макрос")
        Exit Sub
    End If
        Set swModelDocExt = swModelDoc.Extension
    Set swPackAndGo = swModelDocExt.GetPackAndGo 'Get Pack and Go object
    namesCount = swPackAndGo.GetDocumentNamesCount
    status = swPackAndGo.GetDocumentNames(pgFileNames)
    If (Not (IsEmpty(pgFileNames))) Then
        For i = 0 To UBound(pgFileNames)
            det = InStr(pgFileNames(i), ".sldprt")
                If det > 0 Then
                    swApp.DocumentVisible False, swDocumentTypes_e.swDocPART


                    swApp.OpenDoc6 pgFileNames(i), swDocASSEMBLY, swOpenDocOptions_Silent, "", errors, warnings
                    'Set Part = swApp.ActivateDoc2(pgFileNames(i), False, longstatus)
                    
                    swApp.DocumentVisible False, swDocumentTypes_e.swDocPART
                    
                    Set swModel2 = swApp.ActiveDoc
                    ConfigName = GetCurrentConfigName()
                    CatList = ReadCatList()
                    swApp.CloseDoc pgFileNames(i)
                End If
        Next i
    End If
    statuses = swModelDocExt.SavePackAndGo(swPackAndGo) ' Pack and Go
    boolstatus = swModel.EditRebuild3()
End Sub


Function ReadCatList()
  
Set Part = swApp.ActiveDoc
Set sMgr = Part.SelectionManager
Set cpMgr = Part.Extension.CustomPropertyManager("")
boolstatus = Part.Extension.SelectByID2("Sheet<1>", "SUBWELDFOLDER", 0, 0, 0, False, 0, Nothing, 0)
boolstatus1 = Part.Extension.SelectByID2("Элемент списка вырезов1", "SUBWELDFOLDER", 0, 0, 0, False, 0, Nothing, 0)
Set myFeature = sMgr.GetSelectedObject6(1, 0)
If boolstatus = False And boolstatus1 = False Then
   Exit Function
End If
Set SMcpMgr = myFeature.CustomPropertyManager
.....
.....
.....
End Function
 
Перестали работать строки
boolstatus = Part.Extension.SelectByID2("Sheet<1>", "SUBWELDFOLDER", 0, 0, 0, False, 0, Nothing, 0)
boolstatus1 = Part.Extension.SelectByID2("Элемент списка вырезов1", "SUBWELDFOLDER", 0, 0, 0, False, 0, Nothing, 0)

Не получает доступ к элементам списка вырезов, при закрытом файле.

Подскажите как решить эту проблему.

 

SelectById2 работает только с активным документом. А можете рассказать зачем Вы выделяете эти объекты? Я думаю можно сделать другим методом (перебором). Я не знаю Ваш код, но мог бы подсказать, как сделать по другому. Я бы не советовал пользоваться SelectById2 - с ним очень много проблем.

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

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

Подскажите пожалуйста, как при помощи макроса, вставить строку в таблицу спецификации?

Вроде все просто, но ничего не происходит...

 

Здравствуйте, попробуйте метод TableAnnotation::InsertRow.

 

~A.

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

@@artem_cad, как человек, причастный (или когда-то) к SW Corp, расскажи пожалуйста:

http://cccp3d.ru/topic/27048-solidworks-api/page-24#entry705509

Так ли это? Получается что сам топик API SW - пиратство  :smile:

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

Хочу посмотреть значение размера эскиза таким кодом:

 
 
     For i = 1 To swSelMgr.GetSelectedObjectCount2(-1)
 
        If swSelMgr.GetSelectedObjectType3(i, -1) = swSelectType_e.swSelDIMENSIONS Then
            Dim swDispDim As SldWorks.DisplayDimension
            Set swDispDim = swSelMgr.GetSelectedObject6(i, -1)
 
            Dim swDim As SldWorks.Dimension
            Set swDim = swDispDim.GetDimension2(Empty)
 
            MsgBox swDim.GetValue3(swThisConfiguration, Empty)
       
        End If
    Next i
 
А он вместо значения размера показывает ошибку. Где я накосячил?
Изменено пользователем IgorT
Ссылка на сообщение
Поделиться на других сайтах

SelectById2 работает только с активным документом. А можете рассказать зачем Вы выделяете эти объекты? Я думаю можно сделать другим методом (перебором). Я не знаю Ваш код, но мог бы подсказать, как сделать по другому. Я бы не советовал пользоваться SelectById2 - с ним очень много проблем.

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

Вот образец спецификации:

Полка ооснования СБ.PDF

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

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

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

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

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

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

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

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

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

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

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




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