Помогите, кто знает.
Как вытянуть номинальное значение размера?
Я проследил, что если возле номинального значения не стоит галочка Авто, то значение номинала добавляется в динамический массив.
...
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);
то ничего не происходит. Номинал в массив не добавляется, а галочка остается не тронутой.
Что делать? Или есть какой-то другой метод, чтоб вытянуть этот номинал?
Так будет понятно Как надо привожу пример
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;
Да я это уже зачитал до дыр.
Проблем в том, что мне не надо рисовать свой размер. Мне нужно из существующего размера вытянуть все параметры.
Так вот вытягиваются все параметры, кроме номинального значения размера. :`(
Неужели прийдется считать его, используя геометрию??
Ну должно же быть какое-то нормальное решение.
После пости недели секса :%: я все-таки нашел ответ. Как всегда все оказалось очень просто.
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, причем оно будет всегда соответствовать номиналу, даже если не включен переключатель авто.