Pull to refresh

Работаем с КОМПАС 3D из DELPHI продолжение (да и окончание)

Reading time11 min
Views1.9K
imageimageПриветствую тебя, %username%.

И так наверно я закончу данным постом то, что начал в предыдущем. Ибо, хоть и времени прошло немного, но информация стала потихоньку появляться на просторах паутинки…
Дабы не отнимать «кусок хлеба» у будущих авторов, я просто закончу то, что начал.



4.4. Работаем со спецификацией.

Продолжим работу с моделью. На очереди оформление.
Сразу начнём с самого (для меня) запутанного — спецификация.

Copy Source | Copy HTML<br/>procedure TForm2.SetSpc (Nk:Integer; SSpec:String);<br/>var<br/>  spc: ksSpecification;<br/>  iter: ksIterator;<br/>  obj, columnType, ispoln, blok: LongInt;<br/>  count: Integer;<br/>  spcColPar: ksSpcColumnParam;<br/>  buf: string;<br/>begin<br/> <br/>    spc := ksSpecification(doc3d.GetSpecification); //Получаем объект спецификации.<br/>    if spc = nil then exit;<br/> <br/>    iter := ksIterator( kompas.GetIterator() ); //Инициализируем итератор<br/>    iter.ksCreateSpcIterator( '',  0,  0 ); //Прикручиваем итератор к спецификации<br/>    if iter.Reference <>  0 then begin //Если есть ссылки на объекты<br/>        obj := iter.ksMoveIterator( 'F' ); //находим первый<br/>        //узнаем количество колонок у базового объекта спецификации<br/>        count := spc.ksGetSpcTableColumn( '',  0,  0 );<br/>        //kompas.ksMessage( Format( 'Кол-во колонок = %d', [ count ] ) ); //для самоконтроля<br/> <br/>        spcColPar := ksSpcColumnParam( kompas.GetParamStruct(ko_SpcColumnParam) );<br/>        if spcColPar<>nil then<br/>          if spc.ksGetSpcColumnType( obj, //объект спецификации<br/>                                4, // номер колонки, начиная с 1, нас интересует<br/>                                spcColPar ) <>  0 then begin <br/>           //Получили параметры колонки, "расчленим" их на составляющие<br/>           columnType := spcColPar.columnType; <br/>           ispoln := spcColPar.ispoln;<br/>           blok := spcColPar.block;<br/>           //Получаем в буфер содержимое ячейки таблицы (при заданном объекте, в заданной колонке)<br/>           buf := spc.ksGetSpcObjectColumnText( obj, columnType , ispoln, blok );<br/> <br/>           //kompas.ksMessage( buf );          //Смотрим, что получилось (для самоконтроля)<br/>           spc.ksSpcObjectEdit(obj); //Открываем для редактирования.<br/>           if spc.ksSetSpcObjectColumnText(columnType,ispoln, blok , SSpec)<>1 then<br/>              ShowMessage('Что то тут не так');//Пытаемся установить наш текст<br/>           spc.ksSpcObjectEnd(); //Хватит редактировать<br/>           //buf := spc.ksGetSpcObjectColumnText( obj, columnType    , ispoln, blok );<br/>           //kompas.ksMessage( buf ); //ПРОВЕРКА (для самоконтроля)<br/>        end;<br/> <br/>        //obj := iter.ksMoveIterator( 'N' );  //При необходимости<br/>                                              //Находим следующий объект итерации<br/>    end;<br/>end;<br/> <br/>


4.5. Работаем с наименованием детали.

Тут всё гораздо проще.
Мы имеем переменную part: ksPart;
part.marking:='Название детали'; //Обзываем деталь.

4.6. Работаем с чертежом.

Данный пункт достаточно обширный.
Но в процессе написания этой части статьи, я абсолютно случайно нагуглил ссылку. «Случайности не случайны» (с)
Там приведён неплохой «разбор» работы с чертежами, и их элементами. (главная страница темы)
В связи с этим количество моих «изливаний» резко сократилось. Т.к. шаблонный чертёж у нас параметризован, то при изменении размеров детали, проекция автоматически изменяется, соответственно меняются на правильные и размеры.
Открыть шаблон, нам тоже не составит труда:

Copy Source | Copy HTML<br/>if Kompas = nil then begin<br/>   {$IFDEF __LIGHT_VERSION__}<br/>   Kompas:= KompasObject( CreateOleObject('KompasLT.Application.5') );<br/>   {$ELSE}<br/>   Kompas:= KompasObject( CreateOleObject('Kompas.Application.5') );<br/>   {$ENDIF}<br/>   if Kompas <> nil then Kompas.Visible := true;<br/>end;<br/> <br/>doc2d:= ksDocument2D( kompas.Document2D );<br/>if FileIsThere(Path+'Шаблоны\'+FileName) then             <br/>        doc2d.ksOpenDocument(Path+'Шаблоны\'+FileName,false)  //открываем чертеж<br/>        else Kompas.ksMessage('Файл не найден - '+FileName); <br/>


5. Маленькие «обходные пути». Или не всегда вредные советы.


5.1. Шаблон чертежа — вместо шаблона модели.

На мой, не до конца искушённый взгляд, при большом количестве однотипных деталей, на каждую из которых необходим отдельный рабочий чертёж, удобно воспользоваться заполнением шаблона, созданного непосредственно из чертежа.
Тем самым мы уменьшаем объём «избыточных» данных на жёстком диске, увеличиваем скорость обработки (при более, чем 100 чертежей это уже достаточно критично).
(На самом деле это не совсем правильный метод, проще создать один чертёж с таблицей размеров. Но в 90% случаев желание заказчика мы обязаны удовлетворить, если это не противоречит нашим морально-этическим принцыпам, и переубедить его «мирным» путём не удаётся)
Сделать шаблон достаточно просто. Для этого надо разбить виды (чтоб отвязать от модели) и заменить значения размеров шаблонным именем. Пример: ,,,,,.
Затем мы просто меняем размеры непосредственно в чертеже.
Ну, естественно, что «просто» — понятие относительное.
И мы снова берёмся за «любимую» итерацию, отнимающую и не лишнее время и дополнительные ресурсы компьютера.

Copy Source | Copy HTML<br/>function TForm2.DrawWD:Boolean;<br/>var Iter: ksIterator;<br/>      param:ksDimTextParam;<br/>      iDimParams : ksLDimParam; //Структура описывающая линейный размер<br/>      arr:ksDynamicArray;<br/>      textLine : ksTextLineParam;<br/>      textItem : ksTextItemParam;<br/>      i,ref:Integer;<br/>      kStr:ksChar255; //Вот такой специфичный тип переменных там обитает ))<br/>begin<br/>     Result:=False;<br/>     Iter:=ksIterator(Kompas.GetIterator); //Снова итератор запускаем<br/>     If Iter.ksCreateIterator(LDIMENSION_OBJ, 0)=False then exit;<br/>     //Привязали итератор к линейным размерам<br/> <br/>     ref:=Iter.ksMoveIterator('F');<br/>     if Doc2.ksExistObj(ref)=1 then<br/>       repeat // перебираем объекты<br/> <br/>          iDimParams := ksLDimParam(Kompas.GetParamStruct(ko_LDimParam));<br/>          textLine := ksTextLineParam( kompas.GetParamStruct( ko_TextLineParam) );<br/>          textItem := ksTextItemParam( kompas.GetParamStruct(ko_TextItemParam) );<br/>          if ( (iDimParams = nil) Or (textLine = nil) Or (textItem = nil) ) then Exit;<br/>          Doc2.ksGetObjParam(ref, iDimParams, ALLPARAM); //берём ссылку на все параметры объекта<br/>          param := ksDimTextParam( iDimParams.GetTPar ); //Закидываем текстовые параметры в переменную<br/>          if param = nil then Exit;<br/>          arr := ksDynamicArray( param.GetTextArr ); //Получаем некий массив строк из структуры параметра<br/>          if arr = nil then Exit;<br/> <br/>          kStr:=ksChar255(kompas.GetParamStruct(ko_Char255));<br/>          for I :=  0 to arr.ksGetArrayCount - 1 do begin //пробегаем по массиву в поисках шаблона<br/>            arr.ksGetArrayItem(i,kStr);<br/> <br/>            if '<L1>'=kStr.str then kStr.str:=Format('%1.1f',[L1]);<br/>            if '<L2>'=kStr.str then kStr.str:=Format('%1.1f',[L2]);<br/>            if '<L3>'=kStr.str then kStr.str:=Format('%1.0f',[L3]);<br/> <br/>            if '<D1>'=kStr.str then kStr.str:=Format('%1.0f',[D1]);<br/>            if '<D2>'=kStr.str then kStr.str:=Format('%1.0f',[D2]);<br/>            if '<D3>'=kStr.str then kStr.str:=Format('%1.1f',[D3]);<br/>            //Улучшить код можно путём уточнения переменных (целое/дробное) и внесение поправок в параметры функции Format()<br/> <br/>            arr.ksSetArrayItem(i,kStr); //Заносим изменения обратно в массив<br/>          end;<br/> <br/>          param.SetTextArr(arr); //Заносим массив в структуру параметра<br/>          iDimParams.SetTPar(param); //Заносим структуру параметра в структуру размера<br/> <br/>          doc2.ksSetObjParam(ref,iDimParams,ALLPARAM); //И всё это в документ сохраняем.<br/> <br/>          ref:=Iter.ksMoveIterator('N');<br/>       until Doc2.ksExistObj(ref)= 0;<br/>     Iter.ksDeleteIterator;<br/> <br/>     doc2.ksRebuildDocument;<br/>     Result:=True;<br/>end;<br/> <br/>

Пример чисто номинальный, но вымученный двумя часами «разбора полётов» описаний…

5.2. Избавляемся от «лишних телодвижений».

В чертеже зачастую приходится менять не только размер, но и какой то текст (Например: Номер_по_плану, Заказчик, Кол-во_изделий).
Чтобы не «пробегать» элементы чертежа ещё раз, но с привязкой к текстовым объектам чертежа, можно вместо текста, создать эти надписи как значения размеров:
Создайте линейный размер на свободном месте чертежа. Замените значение размера шаблонным именем. В свойствах размера уберите лишние линии и стрелки.
Теперь при «пробежке» по размерам, мы заодно можем заменить и текст в чертеже.
К стати, мы можем использовать этот приём для приведения некоторых других типов размеров к линейным размерам.

5.3. И ещё немного.

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

Copy Source | Copy HTML<br/>uses ShellApi;<br/> <br/>function CopyDir(const fromDir, toDir: string): Boolean;<br/>var<br/>  fos: TSHFileOpStruct;<br/>begin<br/>  ZeroMemory(@fos, SizeOf(fos));<br/>  with fos do<br/>  begin<br/>    wFunc := FO_COPY;<br/>    fFlags := FOF_FILESONLY;<br/>    pFrom := PChar(fromDir + # 0);<br/>    pTo := PChar(toDir)<br/>  end;<br/>  Result := ( 0 = ShFileOperation(fos));<br/>end; <br/>


На самом деле «подводных камней» как в самом КОМПАС 3D, так и при программировании под него, гораздо больше, мне запомнились пока только эти. Ежели что вспомню, будет UPDATE.
Tags:
Hubs:
Total votes 14: ↑8 and ↓6+2
Comments1

Articles