С помощью ksLDimParam->GetTPar получаю ksDimTextParam
Почему метод GetTextArr() возвращает массив нулевой длины?
Дааа, а форум тут оживленный. За 10 последних дней ни одной новой реплики...
А ты содаешь размер, или редактируешь существующий объект?
Я редактирую существующий. И еще после отработки библиотеки он говорит "Неверный указатель массива"..
Кстати, то же самое происходит и при использовании ksRDimParam...
Письмом ответить не получилось ... не отправляется ...
Навскидку - компас очень чувствителен очень к операциям с памятью - то
есть следует выделять память под массивы строк принудительно перед
считыванием оного... по крайней мере я очень с этим намучился поначалу
(я пишу на Delphi).
Следующий момент - вспоминается что и я с этими DimParam-ами намучился
из за того что там несколько уровней вложенности этих текстовых массивов...
бабка за дедку , внучка за бабку ...
почитал хелп сечас и подумал ещё :
GetTextArr(); возвращает не МАССИВ (указатель на начало массива) , а
УКАЗАТЕЛЬ на ИНТЕРФЕЙС
динамического массива ksDynamicArray строк типа CHAR_STR_ARR или TEXT_LINE_ARR.
а у него есть свои методы
(ksDeleteArray ksClearArray ksGetArrayCount ksGetArrayType
ksExcludeArrayItem ksAddArrayItem ksGetArrayItem ksSetArrayItem)
может через них надо ?
Спасибо за готовность помочь, с помощью Аскона разобрался. Дело было во флагах для ksGetObjParam. Насчет ksDynamicArray верно, я так и делал. Но все равно, я готов их убить за то, что они придумали этот массив. Я не понял, какой в этом смысл, кроме сомнительных преимуществ экономии памяти? Неужели нельзя было фиксированную структуру сделать? Я столько "удовольствия" получил, отлаживая логику, которая на основании этих флагов выцепает размер, а что касается его изменения, то до сих пор решиться не могу до конца довести метод.
Здесь назревает небольшой инструментарийчик для тех, кто пишет под .NET. Так, обертки для классов, константы и еще предполагаю написать несколько классов, облегчающих работу с компасовскими атрибутами, размерами теми же и с другими вещами, которые явно разрабатывались "для человека"... Так что милости просим заинтересованных лиц, связывайтесь, и помощь мне тоже пригодится, обертки пока не фонтан...
А вы можете создать динамический массив и присваивать его элементам значения разных типов?
Не понял?
Попробуйте так
DimParams:=ksLDimParam(KompasApi.GetParamStruct(ko_LDimParam));
DimDrawParams:=ksDimDrawingParam(DimParams.GetDPar);
DimSourceParams:=ksLDimSourceParam(DimParams.GetSPar);
DimTextParams:=ksDimTextParam(DimParams.GetTPar);
// Размер диаметра отверстия
DimDrawParams.Init;
DimDrawParams.textPos:=10; // Положение текста размерной надписи
DimDrawParams.textBase:=0; // Расстояние TextPos от второй точки
DimDrawParams.pt1:=1; // Стрелка внутри
DimDrawParams.pt2:=1; // Стрелка внутри
DimSourceParams.Init;
DimSourceParams.x1:=Coleso.DOtv/2; // Привязка первая точка
DimSourceParams.y1:=Coleso.HStup/2-Coleso.FasOtv;
DimSourceParams.x2:=-Coleso.DOtv/2; // Привязка вторая точка
DimSourceParams.y2:=Coleso.HStup/2-Coleso.FasOtv;
DimSourceParams.dx:=0; // Вектор определяющий положение
if YSm>0 then DimSourceParams.dy:=YSm+10+Coleso.FasOtv
else DimSourceParams.dy:=10+Coleso.FasOtv; // размерной линии
DimSourceParams.basePoint:=1;
DimTextParams.Init(False);
// Автоматическое определение размера
DimTextParams.SetBitFlagValue(_AUTONOMINAL,True);
// Есть текст до размера
// DimTextParams.SetBitFlagValue(_PREFIX,True);
// Проставлять отклонения
//DimTextParams.SetBitFlagValue(_DEVIATION,True);
// Единица измерения
//DimTextParams.SetBitFlagValue(_UNIT,True);
// Есть текст после размера
// DimTextParams.SetBitFlagValue(_SUFFIX,True);
// Тип значка перед размером
DimTextParams.sign:=1;
iStr:=ksChar255(KompasApi.GetParamStruct(ko_Char255));
ArrText:=ksDynamicArray(DimTextParams.GetTextArr);
{ iStr.str:=’префикс’;
ArrText.ksAddArrayItem(-1,iStr);
iStr.str:=’+0.5’;
ArrText.ksAddArrayItem(-1,iStr);
iStr.str:=’-0.8’;
ArrText.ksAddArrayItem(-1,iStr);
iStr.str:=’мм’;
ArrText.ksAddArrayItem(-1,iStr);
iStr.str:=’t &04&01’;
ArrText.ksAddArrayItem(-1,iStr); }
DimRef:=Doc.ksLinDimension(DimParams);