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

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

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

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

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

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

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

Номинальное значение размера

Автор Beldar, 15.04.08, 02:14:24

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

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

Beldar

Помогите, кто знает.
Как вытянуть номинальное значение размера?
Я проследил, что если возле номинального значения не стоит галочка Авто, то значение номинала добавляется в динамический массив.
...
iArr          : ksDynamicArray;       // динамический массив
begin
  iDimParams := ksLDimParam(iKompas.GetParamStruct(ko_LDimParam));
  if iDimParams = nil then exit;

  iDoc.ksGetObjParam(Hnd, iDimParams, ALLPARAM);        // получение параметров размера
  iDimTextParam := ksDimTextParam(iDimParams.GetTPar);

  iArr := ksDynamicArray(iDimTextParam.GetTextArr);     // инициализация динамического массива

  iArr.ksAddArrayItem(0,iDimTextParam.GetTextArr);     // заполнение массива

Но когда я пробую эту галочку убрать программно

iDimTextParam.SetBitFlagValue( _AUTONOMINAL, false);

то ничего не происходит. Номинал в массив не добавляется, а галочка остается не тронутой.
Что делать? Или есть какой-то другой метод, чтоб вытянуть этот номинал?

vmnick

Так будет понятно Как надо привожу пример

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;

Beldar

Да я это уже зачитал до дыр.
Проблем в том, что мне не надо рисовать свой размер. Мне нужно из существующего размера вытянуть все параметры.
Так вот вытягиваются все параметры, кроме номинального значения размера. :`(

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

Beldar

После пости недели секса :%: я все-таки нашел ответ. Как всегда все оказалось очень просто.

var
  iDimParams  : ksLDimParam;          // структура хранящая все свойства размера
  DimValue     : ksDoubleValue;        // структура хранит число типа Double (для номинального значения размера)

begin
// инициализация
  iDimParams := ksLDimParam(iKompas.GetParamStruct(ko_LDimParam));
  if iDimParams = nil then exit;
  iDoc.ksGetObjParam(Hnd, iDimParams, ALLPARAM);        // получение параметров размера
 
  DimValue := ksDoubleValue(iKompas.GetParamStruct(ko_DoubleValue));
  if DimValue = nil then exit;

  iDoc.ksGetObjParam(Hnd, DimValue, DIM_VALUE);    // получаем номинальное значение размера
// где Hnd - указатель на объект размера (для более подробной информации - F1 над функцией ksGetObjParam)
  ShowMessage(FloatToStr(DimValue.value));             // Вывод сообщения с номинальным размером

Номинальное значение получить легче от IDimensionText::NominalValue, причем оно будет всегда соответствовать номиналу, даже если не включен переключатель авто.