• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Помогите установить совпадение точек в эскизе через параметризацию в Dеlphi

Автор IgorRUtver, 01.08.13, 11:13:31

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

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

IgorRUtver

Делаю библиотечку в учебных целях. Попытался построить тело путем вращения эскиза. Все норм, создает деталь, вычерчивает эскиз из основных и осевой линии, после выхожу из редактирования детали и создаю операцию вращения. И все работало до того момента пока в эскиз не добавил дугу. И теперь операция вращени корректно строится только если эскиз параметризован, а именно установлено совпадение точек, хотя в программе координаты концов отрезков и дуги совпадают друг с другом. Подскажите почему у меня на этапе параметризации компас выдает ошибку. Сама библиотека скомпилировалась, но при выполнении в КОМПАС вылетает ошибочка. В программировании новичек, прошу извинить если могу тупить.

  var
         //Объявляю переменные для параметров параметризации эскиза.
         iParametrizationParam : ksParametrizationParam;
         p1,  p2, p3, p4, p5, p6, p7, p8, p9, p10,     
         gr1, gr2 : Reference;

......здесь код создания детали-> и построения эскиза на плоскости
       
//Запускаю проесс редактирования эскиза   
         doc_1 := ksDocument2D(iSketchDef_1.BeginEdit);
               if (doc_1 <> nil) then
                begin
                // Построение эскиза
                   //Основные линии
                    p1 := doc_1.ksLineSeg(massIshodForm3[12],massIshodForm3[13],massIshodForm3                                        [28],massIshodForm3[29],1);
                    p2 := doc_1.ksLineSeg(massIshodForm3[28],massIshodForm3[29],massIshodForm3                                        [26],massIshodForm3[27],1);
                    p3 := doc_1.ksLineSeg(massIshodForm3[26],massIshodForm3[27],massIshodForm3                                        [24],massIshodForm3[25],1);
                    p4 := doc_1.ksLineSeg(massIshodForm3[24],massIshodForm3[25],massIshodForm3                                        [22],massIshodForm3[23],1);
                    p5 := doc_1.ksLineSeg(massIshodForm3[22],massIshodForm3[23],massIshodForm3                                        [20],massIshodForm3[21],1);
                    p6 := doc_1.ksLineSeg(massIshodForm3[20],massIshodForm3[21],massIshodForm3                                         [18],massIshodForm3[19],1);
                    p7 := doc_1.ksLineSeg(massIshodForm3[18],massIshodForm3[19],massIshodForm3                                         [16],massIshodForm3[17],1);
                    p8 := doc_1.ksLineSeg(massIshodForm3[14],massIshodForm3[15],massIshodForm3                                         [16],massIshodForm3[17],1);

                  //Дуга
                    p9 := doc_1.ksArcByPoint(massIshodForm3[9],massIshodForm3[10],
                                       massIshodForm3[11],
                                       massIshodForm3[12],massIshodForm3[13],
                                       massIshodForm3[14],massIshodForm3[15],-1,1);
                  //Осевая
                  doc_1.ksLineSeg(massIshodForm3[28]+50,massIshodForm3[29],massIshodForm3                                  [28]+100,massIshodForm3[29],3);

                   //Создаю группу объектов   1
                     gr1 := doc_1.ksNewGroup(0);
                   // Добавляю линии эскиза в группу
                      doc_1.ksAddObjGroup(gr1,p1);
                      doc_1.ksAddObjGroup(gr1,p2);
                      doc_1.ksAddObjGroup(gr1,p3);
                      doc_1.ksAddObjGroup(gr1,p4);
                      doc_1.ksAddObjGroup(gr1,p5);
                      doc_1.ksAddObjGroup(gr1,p6);
                      doc_1.ksAddObjGroup(gr1,p7);
                      doc_1.ksAddObjGroup(gr1,p8);
                      doc_1.ksAddObjGroup(gr1,p9);
                      doc_1.ksEndGroup;

                   //Параметризовать эскиз
                   iParametrizationParam.pointsLimit := 0.01; //задаю допуск на совпадение точек
                   iParametrizationParam.nearestPoints := true; // совпадение точек true
                   doc_1.ksParametrizeObjects(gr1,iParametrizationParam);

                end;

            // Завершаю редактирование эскиза
            iSketchDef_1.EndEdit;

Эскиз строится а параметризация не проходит, помогите пожалуйста.

Вы объявили  iParametrizationParam : ksParametrizationParam;, а где получили интерфейс?
Необходимо воспользоваться функцией GetParamStruct(ko_ParametrizationParam), чтобы получить указатель на интерфейс ksParametrizationParam.

IgorRUtver

Спасибо Sabahs. Когда пытался осилить самостоятельно и читал справку там написано, что необходимо использовать  GetParamStruct(ko_ParametrizationParam). А как ее использовать не допер.

Получить указатель на интерфейс структуры параметров объекта нужного типа.
Синтаксис Automation:
LPDISPATCH GetParamStruct (short structType);
Входной параметр:
  structType - тип интерфейса параметров.
Возвращаемое значение:
  указатель на интерфейс указанного типа из StructType2D.

Входной параметр тип интерфейса ksParametrizationParam, я уже объявил переменную этого типа  "iParametrizationParam : ksParametrizationParam;"
Возвращаемое значение опять тип интерфейса  ksParametrizationParam.

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


Берем пример Step2a, смотрим и видим:
iChar255 := ksChar255(iKompasObject.GetParamStruct( ko_Char255 ));
в Вашем случае будет выглядеть так:
iParametrizationParam:=ksParametrizationParam(iKompasObject.GetParamStruct(ko_ParametrizationParam));

IgorRUtver

Извиняюсь, действительно пример есть, не научился видеть пока нужную информацию.

iParametrizationParam:=ksParametrizationParam(ks.GetParamStruct(ko_ParametrizationParam));

Вот только теперь возмущается, что "Необъявленный индетефикатор  ko_ParametrizationParam"
В справке нашел, что эта некая константа предедаваемая в GetParamStruct, дальше на нее выйти не могу. Я так понял, что мне нужно как то объявить ko_ParametrizationParam?

Просто нужно изучить файлы которые находятся в папке c:\Program Files (x86)\ASCON\KOMPAS-3D V14\SDK\Include\.
И в проекте добавить:
uses ksConstTLB;
+ Благодарностей: 2

IgorRUtver

Sabahs большое вам спасибо!!! Файл ksConstTLB и так всегда был подключен, зашел в файл ksConstTLB, нашел там свою константу ko_ParametrisationParam и вижу, что в моем варианте iParametrizationParam:=ksParametrizationParam(ks.GetParamStruct(ko_ParametrizationParam)); прописана с "z" , все заработало :o: и ведь действительно надо было просто почитать файл.
Вот рабочий вариант для таких как я)):

var
         iParametrizationParam : ksParametrizationParam;
         p1,  p2, p3, p4, p5, p6, p7, p8, p9, p10,              // Указатели на объекты
         gr1 : Reference; // Группа объектов

....Здесь создается эскиз и группа gr1
                   //Параметризация
                      //Указатель на интерфейс параметризации
                       iParametrizationParam := ksParametrizationParam(ks.GetParamStruct(ko_ParametrisationParam));
                      //Задаем совпадение точек
                       iParametrizationParam.pointsLimit := 0.01;
                       iParametrizationParam.nearestPoints := true;
                      //Параметризуем
                      doc_1.ksParametrizeObjects(gr1,iParametrizationParam);
....Завершаем редактирование эскиза