Вставка компонета в сборку

Автор Igor F, 25.02.17, 11:10:00

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Igor F

Делаю в Delphi библиотеку для вставки компонентов  в сборку. 
Вызываю форму со списком элементов, далее идет попытка вставить элемент в сборку следующим кодом


procedure TForm1.Button1Click(Sender: TObject);
var
iDoc3D: ksDocument3D;
iPart: ksPart;
iRequestInfo3D: ksRequestInfo3D;
begin
  iKompas := KompasObject(CreateKompasObject);
  iDoc3D := ksDocument3D(iKompas.ActiveDocument3D);
  iPart := ksPart(iDoc3D.GetPart(pNew_Part));
  iPart.fileName := 'D:\Компас\Вилка.m3d';
  iRequestInfo3D := ksRequestInfo3D(iDoc3D.GetRequestInfo(iPart));
  iRequestInfo3D.CreatePhantom;
  ksPart(iRequestInfo3D.GetIPhantom).standardComponent := True;
  if iDoc3D.UserGetPlacementAndEntity(0) then
  begin
   iPart.SetPlacement(iRequestInfo3D.GetPlacement);
   iDoc3D.SetPartFromFile('D:\Компас\Вилка.m3d', iPart, True);
   iPart.UpdatePlacement;
  end
  else
    iKompas.ksMessage('Fail!');
end;


Библиотека компилится, подключается к компасу, при выполнении вставки выдаётся ошибка "Range check error". Ошибка выдаётся для строки " iPart := ksPart(iDoc3D.GetPart(pNew_Part));".

Подскажите, что не так в данной строке?


#1
А, где тут сборка?

Igor F

Цитата: Sabahs от 25.02.17, 12:32:51
А, где тут сборка?

Сборка открыта на момент вызова библиотеки, получаю активны 3д документ, в него пытаюсь вставить сборку (не уверен в правильности написания кода получения текущего документа, опыт общения с компасом второй день) .

А, я уверен, что Ваш код 100%, неправильный.
Вы напротив каждой строчки, поставьте тире и напишите, что она делает.

Igor F

Цитата: Sabahs от 25.02.17, 19:05:22
А, я уверен, что Ваш код 100%, неправильный.
Вы напротив каждой строчки, поставьте тире и напишите, что она делает.

var
iDoc3D: ksDocument3D;
iPart: ksPart;
iRequestInfo3D: ksRequestInfo3D;
begin
  iKompas := KompasObject(CreateKompasObject); - открываем интерфейс для компаса
  iDoc3D := ksDocument3D(iKompas.ActiveDocument3D); - получаем активный в данный момент 3д документ.
  iPart := ksPart(iDoc3D.GetPart(pNew_Part)); -   получаем внутри документа интерфейс для нового элемента.
  iPart.fileName := 'D:\Компас\Вилка.m3d'; - передаём в интерфейс элемента параметр, содержащий путь к файлу
  iRequestInfo3D := ksRequestInfo3D(iDoc3D.GetRequestInfo(iPart)); - подключение в интерфейс, для дальнейшего позиционирования элемента
  iRequestInfo3D.CreatePhantom; - создание фантома
  ksPart(iRequestInfo3D.GetIPhantom).standardComponent := True;
  if iDoc3D.UserGetPlacementAndEntity(0) then - проверяем запустился ли процесс перемещения
  begin
   iPart.SetPlacement(iRequestInfo3D.GetPlacement); - передаём для объекта вставки   местоположение
   iDoc3D.SetPartFromFile('D:\Компас\Вилка.m3d', iPart, True); - создаём сам объект из указанного файла.
   iPart.UpdatePlacement; - перемещаем объект в указанное место
  end
  else
    iKompas.ksMessage('Fail!');
end;


Собственно, на просторах интернета нарыл пример вставки элемента в сборку:


procedure Insertd3InAssemble(FileNameDet:string);
var
  iPart:ksPart;
  begin
   iDocument3D := ksDocument3D(iKompas.ActiveDocument3D());
    if (iDocument3D = nil) or (iDocument3D.IsDetail) then
    begin
      iKompas.ksMessage('Текущий документ не является сборкой!');
      exit;
    end;
   iPart := ksPart(iDocument3D.GetPart(pNew_Part));
   iPart.fileName := FileNameDet;
   iDocument3D.SetPartFromFile(FileNameDet, iPart, false);
   iPart.Update;
end;


Данный код тоже вылетает на "iPart := ksPart(iDocument3D.GetPart(pNew_Part))", как тогда правильно получить интерфейс для нового элемента?


Slaviation

Может

var
  iTopPart, iPart:ksPart;
...
iTopPart:= ksPart(iDocument3D.GetPart(pTop_Part));
iPart = ksPart(iTopPart.GetPart(pNew_Part));
...

Igor F

Цитата: Slaviation от 28.02.17, 07:49:14
Может

var
  iTopPart, iPart:ksPart;
...
iTopPart:= ksPart(iDocument3D.GetPart(pTop_Part));
iPart = ksPart(iTopPart.GetPart(pNew_Part));
...

Не отрабатывает, выдаёт ошибку  "Range check error".


Код ниже отрабатывает, т.е. текущий документ я получаю.

iKompas := KompasObject(CreateKompasObject);
iDoc3D := ksDocument3D(iKompas.ActiveDocument3D);
iDoc3D.Сlose();

Igor F


iPart := ksPart(iDoc3D.GetPart(-3));


Так заработало, с текстовыми названиями типов не работает.

Всем спасибо за участие.


Igor F

Цитата: Sabahs от 28.02.17, 11:05:04
Нужно подключить модуль LDefin3D.

Она подключена, проект компилируются, на "pNew_Part" ошибок нет, но работает только с цифрами.

kisilmike

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

У меня есть файл сборки(пустая сборка). Мне нужно в эту сборку добавить несколько компонентов(m3d файлы с моделями). Пытаюсь написать для этого макрос. Мне совершенно неважно где будут распологаться эти компоненты внутри сборки, просто нужно для импорта чтобы все компоненты били в сборке.

Делаю так:

#Подключаю текущий документ и необходимые библиотеки
import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH

iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
MH.iKompasObject = iKompasObject

iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)
MH.iApplication = iApplication

iDocument3D = iKompasObject.ActiveDocument3D()

iDocument = iApplication.ActiveDocument
iKompasDocument3D = KAPI7.IKompasDocument3D(iDocument)


Далее не могу понять как воспользоваться функцией CreatePartFromFile чтобы создать компонент. Первым параметром я указываю имя файла, вторым я должен указать деталь? Т.е. чтобы создать деталь из файла мне для начала ее нужно создать в документе и уже потом в эту деталь загрузить файл?

Пробую так:

iPart = iDocument3D.GetPart(LDefin3D.pNew_Part) #создаю новый компонент(?)
iDocument3D.CreatePartFromFile('CUA-20M-S316-Hy-LokUSA-12-08-2016_1.m3d', iPart, iPlaneEntity) #пытаюсь в нее загрузить файл


Ничего не выходит. Здесь непонятный момент, что такое iPlaneEntity - в справке КОМПАС-МАСТЕР такое не находит. Как это создать? Нужно ли это если меня устраивает любое положение на плоскости? Для iPart указал pNew_Part - новый компонент, или нужно было pTop_Part, т.е. выбрать сборку?

Не могу никак разобраться с этим всем, буду очень благодарен за любую подсказку, особенно если опишите этапы добавления одного компонента в сборку. Не могу понять как это должно происходить. В документации можно посмотреть список свойств, методов и интерфейсов, но как это использовать - не понимаю. Может есть какая-нибудь литература?

KrissKross

Используйте
IParts7::AddFromFile

пример можно посмотреть в теме
http://forum.ascon.ru/index.php/topic,27370.msg204376.html#msg204376

ссылка на пример во 2 сообщении
от Slaviation
http://forum.ascon.ru/index.php?action=dlattach;topic=27370.0;attach=58119
+ Благодарностей: 1

tramp_m

[quote author=Igor F link=topic=30210.msg235506#msg235506 date=1488010200]
Делаю в Delphi библиотеку для вставки компонентов  в сборку. 
Вызываю форму со списком элементов, далее идет попытка вставить элемент в сборку следующим кодом

[/code]
Каждый раз, читая о программных приложениях, так и напрашивается, сказать «если у вас гондурас , то сходите и почешите»...
ПО заточена под реализацию ЕСКД  и сопутствующими НТД....
Программисты Аскон пытаются в меру способностей и возможностей...
И так сложно разобраться, я тут ещё предлагается огород городить , да ещё и не по ЕСКД  ....
Прошу прощзение может быть не прав.... 



Цитата: tramp_m от 15.03.17, 19:04:15
Каждый раз, читая о программных приложениях, так и напрашивается, сказать «если у вас гондурас , то сходите и почешите»...
Уважаемый, tramp_m!

У Вас есть код?

Если нет, то ненужно тут пурген нести, данная конференция для тех, кто программы пишет, а не про Гондурас.

tramp_m

quote author=Sabahs link=topic=30210.msg236148#msg236148 date=1489595074]
Уважаемый, tramp_m!

У Вас есть код?

Если нет, то ненужно тут пурген нести, данная конференция для тех, кто программы пишет, а не про Гондурас.
[/quote]

У меня нет кода.....
ООООчеень прошу прощения.....
Ни кого не хотел обидеть, просто хотел сказать для тех кто программы пишет.....
Библиотека это структура не ЕСКД, некий вираж от ЕСКД, вот не понятно в какую систему стандартизации....
Программный модуль библиотеки наверное можно использовать ну скажем в некоем поисковике документов, но такие уже существуют (например, спецификация)...
Прошу прощение если что не так.....

Уважаемый Алексей Павлович, закрывайте тему, ЕСКД - это другая опера.

Starik

Я программированием не занимаюсь. Поэтому мне сложно судить. Хотя по логике вещей ЕСКД и программирование как бы немножко разные темы. Учитывая что топик стартёр получил ответ на свой вопрос, а метры программирования считают что тема ушла в сторону, то давайте её и закроем. Для желающих продолжить обсуждение связи ЕСКАД и программирования остаётся возможность создать новую тему с соответствующим информативным заголовком. И конференцию, пожалуй, тоже лучше выбрать другую.
+ Благодарностей: 1