Спецсимволы в размерной надписи

Автор Хомутов, 08.04.08, 11:46:59

« предыдущая - следующая »

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

Хомутов

Есть проблема(Компас):
В размерной надписи надо вставить спецсимволы.
Пробовал вставлять в строку код символа - не получается (отображается все что угодно кроме того что надо)
Пробовал использовать управляющие символы (& с кодом символа) - получается только в "текст до" если нет номинала.
Если же мне нужно вставить символ еще и в "текст под размерной надписью", то не вставляется ни в "текст до", ни вообще никуда (под размерной надписью Компас вообще не воспринимает управляющие символы, так и пишет "&02Text")

vmnick

Ето тоже что и в предидущем разделе порядок задания значений Обратите внимание tPar.bitFlag b tPar.sign

procedure DrawDiamDim;
var
  cir, obj  : Reference;
  aDim      : ksRDimParam;
  textLine  : ksTextLineParam;
  textItem  : ksTextItemParam;
  tPar      : ksDimTextParam;
  font      : ksTextItemFont;
  arr, arr1 : ksDynamicArray;
  sPar      : ksRDimSourceParam;
  dPar      : ksRDimDrawingParam;
  str       : ksChar255;
begin
   cir      := doc.ksCircle( 100, 100, 50, 1 );
  aDim     := ksRDimParam    ( kompas.GetParamStruct(ko_RDimParam)      );
  textLine := ksTextLineParam( kompas.GetParamStruct( ko_TextLineParam) );
  textItem := ksTextItemParam( kompas.GetParamStruct(ko_TextItemParam)  );
  if ( (aDim = nil) Or (textLine = nil) Or (textItem = nil) ) then
      Exit;

   textLine.Init;
   textItem.Init;

   tPar := ksDimTextParam( aDim.GetTPar            );
   font := ksTextItemFont( textItem.GetItemFont    );
  arr  := ksDynamicArray( textLine.GetTextItemArr );
   sPar := ksRDimSourceParam( aDim.GetSPar );
   dPar := ksRDimDrawingParam( aDim.GetDPar );
   if ( (tPar = nil) Or (font = nil) Or (sPar = nil) Or (dPar = nil) ) then
      Exit;

   tPar.Init( false );
   tPar.SetBitFlagValue( _AUTONOMINAL, true );
        tPar.sign := 0;
        tPar.bitFlag :=$4+$10+$20;

   font.Init;
   font.height   := 5;
   font.ksu      := 1;
   font.fontName := 'GOST type A';
   font.SetBitVectorValue( NEW_LINE, true );
   arr.ksAddArrayItem( -1, textItem );

        arr1 := ksDynamicArray( tPar.GetTextArr );
   if arr1 = nil then    Exit;
              str:=ksChar255(kompas.GetParamStruct(ko_Char255));
              str.str:=PChar('&02'); arr1.ksAddArrayItem(  -1, str);
              str.Str:='100';        arr1.ksAddArrayItem(  -1, str);
              str.str:=PChar('h14'); arr1.ksAddArrayItem(  -1, str);
              //if s[4]<>'' then  begin  str.str:=PChar(s[4]); arr1.ksAddArrayItem(  -1, str);end;



   sPar.Init;
   sPar.xc  := 100;
   sPar.yc  := 100;
   sPar.rad := 50;

  dPar.Init;
  obj := doc.ksDiamDimension( aDim );
   if obj <> 0 then begin
     doc.ksGetObjParam( obj, aDim, ALLPARAM );
     sPar.rad := 100;
     kompas.ksMessage( 'Поменяем параметры' );
      doc.ksDeleteObj( cir );
     doc.ksCircle( 100, 100, 100, 1 );
    doc.ksSetObjParam( obj, aDim, ALLPARAM );
   end;
end;

Олег Лысенко

Есть еще разница делать это из под V9 или V10, почитайте СДК работу с юникодами

Хомутов

Спасибо. Я уже разобрался
Проблема была в том, что что динамический массив, в котором хранилась размерная надпись ksDimTextParam (символы вставлял в уже существующую надпись) был типа CHAR_STR_ARR. Если установить тип TEXT_LINE_ARR  просто используя флаг ksDimTextParam::stringFlag, то проблема решается частично: почему-то перебирай все размерные надписи и проставляя каждому ksDimTextParam::stringFlag, в самой первой надписи ничего не меняется. Иными словами для перевода из типа CHAR_STR_ARR в тип TEXT_LINE_ARR нужно не просто поставить флаг. Надо создавать массив нужного типа, туда переписывать старый (построчно) и крепить его к ksDimTextParam.
Так работает без проблем