Reference (InfInterfaces Framework)

Программирование для CATIA.

Reference (InfInterfaces Framework)

Сообщение file » 30 июл 2012 19:46

Добрый день.
Подскажите, пожалуйста, решение задачи.

Дано:
1. Сборка, дерево которой представлено на рисунке на зеленом фоне.
2. Активирован самый верхний уровень сборки.

Требуется:
1. Создать Plane.2 в Component3, совпадающую с плоской гранью Pad.1

Вопросы:
1. Есть возможность получить ссылку на Planar Face с применением SelectElement2, но представляемое имя формируется в контексте Component2 (без упоминания имени компонента, например "Selection_RSur:(Face:(Brp:(Pad.1;2);None:();Cf11:());EdgeFillet.2_ResultOUT;Z0;G2703)"). На основе ссылки создать необходимую плоскость в Component2. Для выполнения копирования/переноса в Component3 нужно активировать компонент, которому принадлежит грань. Как узнать, какому компоненту она принадлежит?
2. И попутный вопрос. Почему, создавая плоскость непосредственно в Component3, сохраненная ссылка (Reference) не указывает напрямую ссылочный объект (вернее указывает, но только в контексте компонента, в котором эта ссылка создавалась)?
Вложения
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: Reference (InfInterfaces Framework)

Сообщение Artem » 31 июл 2012 08:56

1) "Selection_RSur:(Face:(Brp:(Pad.1;2);None:();Cf11:());EdgeFillet.2_ResultOUT;Z0;G2703)") + Part.FindObjectByName()
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Reference (InfInterfaces Framework)

Сообщение Wireless_Fidelity » 01 авг 2012 00:18

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

1) Если выбрана грань, используйте CATIA.ActiveDocument.Selection.Item(1).LeafProduct
2) Сама природа таких ссылок в CATIA подразумевает, что она существует только в каком-либо контексте. В
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Reference (InfInterfaces Framework)

Сообщение file » 01 авг 2012 12:13

Спасибо за ответы.

Artem:
Для применения Part.FindObjectByName() нужен объект Part, а я как раз его пытался определить.

Wireless_Fidelity:
2. Я ваяю на C#, и у меня не получается, имея ссылку на объект (в виде "Selection_RSur:(Face:(Brp:(Pad.1;2);None:();Cf11:());EdgeFillet.2_ResultOUT;Z0;G2703)"), обратиться к этому объекту из другого компонента. Пробовал так:

Код: Выделить всё
//Selection_RSur:(Face:(Brp:(Pad.1;2);None:();Cf11:());EdgeFillet.2_ResultOUT;Z0;G2703) - ссылка на объект в компоненте1
// В компоненте2 пытаюсь создать новую ссылку
компонент2.Product.CreateReferenceFromName("Root/Product1/!Selection_RSur:(Face:(Brp:(Pad.1;2);None:();Cf11:());EdgeFillet.2_ResultOUT;Z0;G2703)")

(по примеру в V5Automation.chm)

в результате получаю сообщение о том что значени не входит в допустимый диапазон...

Моя задача: в компоненте создать объект wireframe (например плоскость), на основе ссылки на объект другого компонента сборки (пусть создаваемая плоскость будет параллельна указанной плоской грани из другого компонента, проходящая на заданном расстоянии); другими словами должны организоваться External References. Ну или создаваемая геометрия может быть изолирована (пытался просто выполнять копирование из одного компонента и вставку как результат в другой компонент, но в этом случае я не смог активировать компонент - переместить Blue Button курсор)...
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: Reference (InfInterfaces Framework)

Сообщение Artem » 01 авг 2012 14:27

мой косяк-картинку не разглядывал особо ....вообще не уверен что продуктовый референс вам поможет, если не получится, то extract + paste special + работаем с последним элементом в "External references"
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Reference (InfInterfaces Framework)

Сообщение Wireless_Fidelity » 01 авг 2012 14:32

Правильный способ подсказывает Артём, нужно экстрактить выделенную грань (AddNewExtract у HybridShapeFactory), затем копировать её со ссылкой в целевой компонент. По-другому External References не появятся.
Активировать компонент можно через выделение и последующее переключение workbench'а. Тема уже обсуждалась в этой ветке.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Make component as UI Active Object with Blue Button cursor

Сообщение file » 02 авг 2012 00:04

Код: Выделить всё
ProductDocument root_doc =
    (ProductDocument)CATIA.ActiveDocument;
Product root = root_doc.Product;

List<Product> lst = new List<Product>();
for (int i = 1; i <= root.Products.Count; i++)
{
    object oi = i;
    Product p = root.Products.Item(ref oi);
    lst.Add(p);
}

CATIA.ActiveDocument.Selection.Clear();
CATIA.ActiveDocument.Selection.Add(lst[0]);
string cmd = "FrmActivate";
CATIA.StartCommand(ref cmd);


В моем случае такой же эффект, как и написано в V5Automation.chm - пропадает возможность выделения объектов.
StartCommand
Starts a CATIA command.
Role:This method starts a command and executes it untill its first interaction. Please notice interactions such as selections you could add after in your macro will not work. StartCommand is useful to execute one-shot (not interactive) commands, it is not safe for interactive commands.


Хотя через поле ввода Power Input все работает прекрасно...
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: Reference (InfInterfaces Framework)

Сообщение Wireless_Fidelity » 02 авг 2012 06:51

Это потому, что FrmActivate использовать крайне не рекомендуется. Работает она не на всех билдах, а Dassault вообще о ней "не знает". Насколько я помню, все можно активировать через воркбенчи + winapi (вызов команды Edit-Object ...-Edit)
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Reference (InfInterfaces Framework)

Сообщение Artem » 02 авг 2012 08:57

Re: после FrmActivate некорректно работает selection.search

Сообщение Artem » 20 апр 2012 16:07

Код: Выделить всё
productDocument1.Selection.Clear
productDocument1.Selection.Add productDocument1.Product
productDocument1.Activate
CATIA.StartCommand "FrmActivate"
If CATIA.GetWorkbenchId = "Assembly" Then CATIA.StartWorkbench ("CATPipConfiguration") Else CATIA.StartWorkbench ("Assembly")'Чтоб не было окошка за новую сборку
CATIA.StartCommand "FrmActivate"
If CATIA.GetWorkbenchId = "Assembly" Then CATIA.StartWorkbench ("CATPipConfiguration") Else CATIA.StartWorkbench ("Assembly")
If CATIA.GetWorkbenchId = "CATPipConfiguration" Then CATIA.StartWorkbench ("Assembly")


- вот это более менее решило проблему - что бы ни было активным до, после этого - активная/текущая верхняя сборка. Если у вас другой вариант было бы очень интересно его узнать...


string cmd = "FrmActivate";
CATIA.StartCommand(ref cmd);

три StartWorkbench и два "FrmActivate" не просто так....
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Reference (InfInterfaces Framework)

Сообщение file » 02 авг 2012 23:34

Интересное решение http://www.plm-forum.ru/forum/viewtopic.php?f=140&t=3535#p21361 активации корневой сборки (или любого другого компонента) с перемещением синего курсора.
Мне только не понятно зачем дважды повторять [FrmActivate + переключение workbench'а], у меня работает и с одной комбинацией. А еще не понятно почему это работает с CATPipConfiguration, но не работает, например, с PrsConfiguration...

Вариант для C#:
Код: Выделить всё
ProductDocument root_doc =
    (ProductDocument)CATIA.ActiveDocument;
Product root = root_doc.Product;

List<ProductStructureTypeLib.Product> lst =
    new List<ProductStructureTypeLib.Product>();
for (int i = 1; i <= root.Products.Count; i++)
{
    object oi = i;
    Product p = root.Products.Item(ref oi);
    lst.Add(p);
}

root_doc.Selection.Clear();
root_doc.Selection.Add(lst[0]);

string cmd = "FrmActivate";
//string wbProductStructure = "PrsConfiguration";
string wbProductStructure = "CATPipConfiguration";
string wbAssembly = "Assembly";
string currentWB = "";

CATIA.StartCommand(ref cmd);
currentWB = CATIA.GetWorkbenchId();
if (currentWB == wbAssembly)
    CATIA.StartWorkbench(ref wbProductStructure);
else
    CATIA.StartWorkbench(ref wbAssembly);

currentWB = CATIA.GetWorkbenchId();
if (currentWB == wbProductStructure)
    CATIA.StartWorkbench(ref wbAssembly);

Спасибо за подсказку!
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: Reference (InfInterfaces Framework)

Сообщение Artem » 03 авг 2012 09:16

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

Я то чего измудрялся тогда - после Power Input "c:FrmActivate", на 16 ни одна команда не работала, даже если вручную команду вбивать. Начиная с 18 вроде как пофиксили это дело.Учитывая что
Хотя через поле ввода Power Input все работает прекрасно...
- видимо у вас уже версия поновее и можно было сделать так....
Код: Выделить всё
AppActivate "CATIA V5"
SendKeys "c:" & "FrmActivate" & Chr(13), True
DoEvents
Dim productDocument1 As ProductDocument
Set productDocument1 = CATIA.ActiveDocument.....
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Reference (InfInterfaces Framework)

Сообщение file » 06 авг 2012 16:58

И все-таки, возвращаясь к вопросу... Неужели нельзя получить ссылки (Reference) на элементы двух различных компонентов сборки для формирования констрейна? В справке есть примеры, но у меня не получается даже простейший: есть сборка из двух деталей, требуется установить констрейн дистанции между плоскостями ZX.
Код: Выделить всё
Dim asm As ProductDocument
Set asm = CATIA.ActiveDocument

Dim root As Product
Set root = asm.Product

Dim c1 As String
c1 = "Part1.1"

Dim com1 As Product
Set com1 = root.Products.Item(c1)

Dim c2 As String
c2 = "Part2.1"

Dim com2 As Product
Set com2 = root.Products.Item(c2)

Dim r1 As Reference
r1 = com1.CreateReferenceFromName("Product1/Part1.1/!zx plane")

Dim r2 As Reference
r2 = com2.CreateReferenceFromName("Product1/Part2.1/!zx plane")

Dim cs As constraints
Set cs = root.Connections("CATIAConstraints")

Dim c As Constraint
c = cs.AddBiEltCst(catCstTypeDistance, r1, r2)
c.Dimension.Value = 10
Валится на строке
Код: Выделить всё
r1 = com1.CreateReferenceFromName("Product1/Part1.1/!zx plane")
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: Reference (InfInterfaces Framework)

Сообщение Artem » 06 авг 2012 17:12

1)или продукт( com1.ReferenceProduct.CreateReferenceFromName попробуй) не тот или имя не то....
2)имя (для фикса) Set refAPO2 = product1.CreateReferenceFromName("ТРД_302/Weld-7199/!ТРД_302/Weld-7199/")
3)Создание констрейна не пишется в макрос?
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Reference (InfInterfaces Framework)

Сообщение file » 06 авг 2012 17:20

Разобрался... Для VBA обязательно использование Set при инициализации объекта. Т.е. правильно будет так:
Код: Выделить всё
Dim asm As ProductDocument
Set asm = CATIA.ActiveDocument

Dim root As Product
Set root = asm.Product

Dim c1 As String
c1 = "Part1.1"

Dim com1 As Product
Set com1 = root.Products.Item(c1)

Dim c2 As String
c2 = "Part2.1"

Dim com2 As Product
Set com2 = root.Products.Item(c2)

Dim r1 As Reference
Set r1 = root.CreateReferenceFromName("Product1/Part1.1/!zx plane")

Dim r2 As Reference
Set r2 = root.CreateReferenceFromName("Product1/Part2.1/!zx plane")

Dim cs As constraints
Set cs = root.Connections("CATIAConstraints")

Dim c As Constraint
Set c = cs.AddBiEltCst(catCstTypeDistance, r1, r2)
c.Dimension.Value = 10#
c.Orientation = catCstOrientOpposite
Просто я пишу в основном на C#, и там это решение почему-то не проходит...
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: Reference (InfInterfaces Framework)

Сообщение Wireless_Fidelity » 06 авг 2012 21:21

Какой именно код не рабоьает в c#?
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Reference (InfInterfaces Framework)

Сообщение file » 06 авг 2012 21:35

Код:
Код: Выделить всё
ProductDocument asm = null;
asm = (ProductDocument)CATIA.ActiveDocument;

Product root = null;
root = asm.Product;

String c1 = "";
c1 = "Part1.1";

Product com1 = null;
object o1 = c1;
com1 = root.Products.Item(ref o1);

String c2 = "";
c2 = "Part2.1";

Product com2 = null;
object o2 = c2;
com2 = root.Products.Item(ref o2);

Reference r1 = null;
string refname1 = "Product1/Part1.1/!zx plane";
r1 = root.CreateReferenceFromName(ref refname1);

Reference r2 = null;
string refname2 = "Product1/Part2.1/!zx plane";
r2 = root.CreateReferenceFromName(ref refname2);

Constraints cs = null;
string constraints = "CATIAConstraints";
cs = (Constraints)root.Connections(ref constraints);

MECMOD.Constraint c = null;
c = cs.AddBiEltCst(CatConstraintType.catCstTypeDistance, r1, r2);

c.Dimension.Value = 10.0;
c.Orientation = CatConstraintOrientation.catCstOrientSame;
Спотыкается на
Код: Выделить всё
r1 = root.CreateReferenceFromName(ref refname1);
Говорит, что значение не попадает в нужный диапазон.
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: Reference (InfInterfaces Framework)

Сообщение Wireless_Fidelity » 06 авг 2012 22:25

Следующий код работает в R20 + VS2010:
Код: Выделить всё
   INFITF.Application CATIA = (INFITF.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application");
            ProductStructureTypeLib.ProductDocument docActive = (ProductStructureTypeLib.ProductDocument)CATIA.ActiveDocument;

            ProductStructureTypeLib.Product prdRoot =  docActive.Product;
            String referenceStr = "Product1/Part1.1/!zx plane";
            INFITF.Reference refPlane = prdRoot.CreateReferenceFromName(ref referenceStr);
            String refName = refPlane.DisplayName;
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Reference (InfInterfaces Framework)

Сообщение file » 06 авг 2012 23:12

CATIA V5 R18 SP3 + MS Visual C# 2008 Express:
Value does not fall within the expected range.


Ясно. Причины в моих библиотеках, которые я сам экстрактил из *.tlb. На новом проекте с библиотеками, подсоединенными через вкладку COM диалога добавления ссылок, все сработало...
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: Reference (InfInterfaces Framework)

Сообщение lexincton » 24 мар 2013 22:35

В VS2012+R21 почему-то не проходит установка ProductDocument из CATIA.ActiveDocument на C#.
Пишет "Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "ProductStructureTypeLib.ProductDocument". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{C9090BFC-5B42-11D1-A124-080009DCA4AE}" возвратил следующую ошибку: Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE))." Кто подскажет в чем может быть проблема???
lexincton
Участник
Участник
 
Сообщения: 75
Images: 0
Зарегистрирован: 29 янв 2012 23:48
Откуда: Россия

Re: Reference (InfInterfaces Framework)

Сообщение lexincton » 25 мар 2013 18:47

Mix писал(а):В VS2012+R21 почему-то не проходит установка ProductDocument из CATIA.ActiveDocument на C#.
Пишет "Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "ProductStructureTypeLib.ProductDocument". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{C9090BFC-5B42-11D1-A124-080009DCA4AE}" возвратил следующую ошибку: Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE))." Кто подскажет в чем может быть проблема???

Вопрос решен, все дело было в неправильно подключенных СОМ-компонентах)
lexincton
Участник
Участник
 
Сообщения: 75
Images: 0
Зарегистрирован: 29 янв 2012 23:48
Откуда: Россия


Вернуться в CAA-RADE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1