Delphi KOMPAS работа с текстом и размерами

Автор Noob, 15.10.09, 23:44:57

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

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

Noob

Ситуация немного усложняется тем что Компас Лайт версии-а апи там немного другой. Впринципе кто имеет навыки работы-думаю поймет синтаксис и поможет.

Возьмем к примеру угловой размер:


procedure DrawAngDim;
var
  p      : reference;
  angPar : ADimParam ;
  ss     : array[0..128] of char;
  t      : integer;
  buf : string;
begin
FillChar( angPar, sizeof(angPar), 0 );

LineSeg( 40, 0, 40, 40, 1 );
LineSeg( 40, 0, 60, 20, 1 );
//параметры текста
  angPar.dPar.textPos   := -10; //автоматическая простановка
  angPar.dPar.textBase  := 0; //над серединой размерной линии
  //должны быть строки PREFIX, номинал ставится auto- не нужно,
  //отклонения ставятся auto-ставить не нужно,UNIT,SUFFIX  - 4 строки
  angPar.tPar.bitFlag := _AUTONOMINAL or _PREFIX or _DEVIATION or _UNIT or _SUFFIX;
//  angPar.tPar.bitFlag = _AUTONOMINAL;
  angPar.tPar.sign := 0;

  angPar.tPar.pText := CreateArray(CHAR_STR_ARR ,nil);

  StrCopy( ss, 'prefix');
  AddArrayItem( angPar.tPar.pText, -1, Addr(ss), 7);
  StrCopy( ss, '+0.3');
  AddArrayItem( angPar.tPar.pText, -1, Addr(ss), 5);
  StrCopy( ss, '-0.3');
  AddArrayItem( angPar.tPar.pText, -1, Addr(ss), 5);
  StrCopy( ss, 'гр');
  AddArrayItem( angPar.tPar.pText, -1, Addr(ss), 3);
  StrCopy( ss, 'suffics');
  AddArrayItem( angPar.tPar.pText, -1, Addr(ss), 8);

//привязка углового размера
  angPar.sPar.xc := 40; angPar.sPar.yc := 0;       // центр
  angPar.sPar.x1 := 40; angPar.sPar.y1 := 40;      // 1 - точка выхода выносной линии
  angPar.sPar.x2 := 60; angPar.sPar.y2 := 20;      // 2 - точка выхода выносной линии

  angPar.sPar.rad := 50;          //радиус размерной дуги
  angPar.sPar.dir := -1;          //направление 1 - размерная линия против часовой стрелки; -1 - по часовой стрелке

//отображение    размера
  angPar.dPar.pl1 := 0;       //признак вкл./выкл.  отрисовки 1 выносной линии  1/0
  angPar.dPar.pl2 := 0;       //признак вкл./выкл.  отрисовки 2 выносной линии  1/0
  angPar.dPar.pt1 := 1;       // тип стрелки у 1-ой выносной линии 0-стрелки нет 1- внутри 2 снаружи 3 -засечка 4 - точка
  angPar.dPar.pt2 := 1;       // тип стрелки у 2-ой выносной линии

p := AngDimension( Addr(angPar) );//параметры углового размера


Требуется написать СВОЙ размер, а не автоматом, вида (60°±1°).
Ну чтобы тем не плодить-заодно а как задать верхний предел, нижний?

Отдельно вопрос про текст-как написать '±15/5' ?

Noob

19.10.09, 09:31:58 #1 Последнее редактирование: 19.10.09, 10:20:25 от Noob
с размерами вроде сам разобрался, более-менее. Не понял только как пределы/лимиты ставить-верхние и нижние. Когда надо лимит-у меня предел и наоборот-а код идентичный, вроде...

С текстом тоже разобрался. Только номера спец символов незнаю где найти? как они там пишутся?

Sheiker

DimText в справке посмотри...
там же и пример есть)))

IgorRUtver

Проставил размер, не нашел как поставить выносные линии от центра, у меня они строятся не от центра, и почему-то значение размера не ставится автоматически номинальным, хотя я так понял tPar.bitFlag := _AUTONOMINAL тут я установил значение соответствующего флага, подскажите что не так

  public
    { Public declarations }
    ks : KompasObject;

var
   doc2    : ksDocument2D;
   aDim : ksADimParam;
   sPar : ksADimSourceParam;
   dPar : ksDimDrawingParam;
   tPar : ksDimTextParam;
begin
    aDim := ksADimParam( ks.GetParamStruct(ko_ADimParam));
    sPar := ksADimSourceParam( aDim.GetSPar );//Привязка
    dPar := ksDimDrawingParam( aDim.GetDPar );.//Параметры
      tPar := ksDimTextParam( aDim.GetDPar );//Текст
       //Текст
       dPar.textPos := -10; //автоматическая простановка
       dPar.textBase  := 0; //над серединой размерной линии
       tPar.bitFlag := _AUTONOMINAL;
       tPar.sign := 0;
       //Привязка
       sPar.xc := 0; // центр x
       sPar.yc := 0; // центр y
       sPar.x1 := x1; //1я - точка выхода выносной x
       sPar.y1 := y1; //1я - точка выхода выносной y
       sPar.x2 := -L2; //2я - точка выхода выносной x
       sPar.y2 := 0;  //2я - точка выхода выносной y
       sPar.rad := L2; //радиус размерной дуги
       //Параметры
       sPar.dir := 1;  //направление 1 - размерная линия против часовой стрелки; -1 - по часовой стрелке
       dPar.pl1 := false; //признак вкл./выкл.  отрисовки 1й выносной линии
       dPar.pl2 := false; //признак вкл./выкл.  отрисовки 2й выносной линии
       dPar.pt1 := 1;  // тип стрелки у 1-ой выносной линии 0-стрелки нет 1- внутри 2 снаружи 3 -засечка 4 - точка
       dPar.pt2 := 1; // тип стрелки у 2-ой выносной линии
    doc2.ksAngDimension(aDim);//Создать угловой размер
end;

Вы, хотите выносные линии от центра, так и ставьте их от центра.
sPar.x1:=0; //1я - точка выхода выносной x
sPar.y1:=0; //1я - точка выхода выносной y
sPar.x2:=0; //2я - точка выхода выносной x
sPar.y2:=0;  //2я - точка выхода выносной y
Angle1:=Angle(0,0,X1,Y1);
Angle2:=Angle(0,0,-L2,0);
sPar.ang1:=Angle1;
sPar.ang2:=Angle2;
sPar.dir:=1; // направление поставите сами 1  - против часовой стрелки, -1 - по часовой стрелке.


IgorRUtver

Спасибо, получилось, я думал что это устанавливается одним свойством 8-), а подскажите пожалуйста почему у меня номинал размера автоматически не ставиться?, а создаётся размер без надписи :|

Внимательно смотрите пример 9, bitFlag это набор битовых флагов.
tPar.Init( False );
tPar.SetBitFlagValue( _AUTONOMINAL, true );
tPar.SetBitFlagValue( _PREFIX,      true );
tPar.SetBitFlagValue( _DEVIATION,   true );
tPar.SetBitFlagValue( _UNIT,        true );
tPar.SetBitFlagValue( _SUFFIX,      true );
tPar.sign := 0;


IgorRUtver

Пересмотрел справку, я так понял (заранее извините что объясняюсь своими словами) там создается массив параметров значений, ну и с массивами параметров ничего не понял, попробовал следующим образом  tPar.SetBitFlagValue(1,true); но при запуски библиотеки, когда она должна построить размер, в компасе вылетает сообщение: error "недопустимое число параметров"

  public
    { Public declarations }
    ks : KompasObject;

var
   doc2    : ksDocument2D;
   aDim : ksADimParam;
   sPar : ksADimSourceParam;
   dPar : ksDimDrawingParam;
   tPar : ksDimTextParam;
begin
    aDim := ksADimParam( ks.GetParamStruct(ko_ADimParam));
    sPar := ksADimSourceParam( aDim.GetSPar );//Привязка
    dPar := ksDimDrawingParam( aDim.GetDPar );.//Параметры
      tPar := ksDimTextParam( aDim.GetDPar );//Текст
       //Текст
       dPar.textPos := -10; //автоматическая простановка
       dPar.textBase  := 0; //над серединой размерной линии

         tPar.SetBitFlagValue(1,true); // Я так понял что таким образом я установил значение флага true

       //Привязка
         sPar.xc := 0; // ????? x
         sPar.yc := 0; // ????? y
         sPar.x1 := 0;
         sPar.y1 := 0;
         sPar.x2 := 0;
         sPar.y2 := 0; 
         sPar.ang1 := iMathematic2D.ksAngle(0,0,x1,y1);
         sPar.ang2 := iMathematic2D.ksAngle(0,0,-L2,0);
       sPar.rad := L2; //радиус размерной дуги
       //Параметры
       sPar.dir := 1;  //направление 1 - размерная линия против часовой стрелки; -1 - по часовой стрелке
       dPar.pl1 := false; //признак вкл./выкл.  отрисовки 1й выносной линии
       dPar.pl2 := false; //признак вкл./выкл.  отрисовки 2й выносной линии
       dPar.pt1 := 1;  // тип стрелки у 1-ой выносной линии 0-стрелки нет 1- внутри 2 снаружи 3 -засечка 4 - точка
       dPar.pt2 := 1; // тип стрелки у 2-ой выносной линии
    doc2.ksAngDimension(aDim);//Создать угловой размер
end;

24.08.12, 17:14:01 #8 Последнее редактирование: 24.08.12, 22:10:56 от Sabahs
Пишите строку так tPar.SetBitFlagValue( _AUTONOMINAL, true ); 
В справке запись _AUTONOMINAL - 0x1 - автоматическое определение номинального значения размера, означает, что за данное свойство отвечает первый бит в переменной.

Константы определены в файле LDefin2D.pas так:
// oпределения для линейного размера
  _AUTONOMINAL         =  $1;   // простановка размера автоматическая
  _RECTTEXT                =  $2;   // текст в рамочке
  _PREFIX                     =  $4;   // есть текст до номинала
  _NOMINALOFF           =  $8;   // нет  номинала
  _TOLERANCE             =  $10;  // квалитет проставлять
  _DEVIATION                =  $20;  // отклонения проставлять
  _UNIT                          =  $40;  // единица измерения
  _SUFFIX                      =  $80;  // есть текст после номинала
  _DEVIATION_INFORM  =  $100; // при включенном _DEVIATION, отклонения есть в массиве текстов( даже если не ручное проставление отклонений).
  _UNDER_LINE        =  $200; // >0 размер с подчеркиванием

P.S. У Вас написано tPar := ksDimTextParam( aDim.GetDPar );//Текст, а нужно так tPar:=ksDimTextParam   ( aDim.GetTPar );

IgorRUtver

 :-))) :o: Ураааа он поставил номинал, спасибо большое))) прям красотуля получилась

IgorRUtver

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

Конкретнее в коде покажите, что Вы делаете.
+ Благодарностей: 1

IgorRUtver

Вот что нашел
IDimensionText::NominalValue  Позволяет получить и установить значение размера
При изменении свойства выполняются следующие действия:
- формируется текстовое значение наминала IDimensionText::NominalText
Тип данных - интерфейс строки текста ITextLine.

и эта вся цепочка справки никак не выведит меня на пример, я так понял что должен создать строку текста и потом както установить ее в значение номинала, вот и не знаю куда дальше идти(


24.09.12, 17:07:09 #13 Последнее редактирование: 24.09.12, 18:48:35 от Sabahs
IDimensionText::NominalValue - Это для API7, у Вас код для API5.
Я пользуюсь такой функцией:
TextLineValue:ITextLine;
DimText:IDimensionText;
TextLineValue:=DimText.Suffix;
if TextLineValue<>nil then
begin
     AddTextItem(TextLineValue,'*',ksTItString);
     TextLineValue:=nil;
end;
//==============================================================================
// Задать компоненту текста
procedure AddTextItem(Line:ITextLine;Str:WideString;tType:ksTextItemEnum);
var
Item:ITextItem;
begin
   if Line<>nil then
    begin
       Item:=Line.Add();
       if Item<>nil then
        begin
            Item.Str:=Str;
            Item.ItemType:=tType;
            Item.Update;
        end;
   end;
end;

IgorRUtver

ухх, сложно для меня, тут мои 'познания' совсем малы :|, спасибо за ответ, буду разбираться есть над чем думать