Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Тема начата: Ethereal от 12.05.03, 11:33:12

Название: ksLDimParam
Отправлено: Ethereal от 12.05.03, 11:33:12
С помощью ksLDimParam->GetTPar получаю ksDimTextParam
Почему метод GetTextArr() возвращает массив нулевой длины?

Дааа, а форум тут оживленный. За 10 последних дней ни одной новой реплики...
Название: Re:ksLDimParam
Отправлено: Skiff от 12.05.03, 12:02:01
А ты содаешь размер, или редактируешь существующий объект?
Название: Re:ksLDimParam
Отправлено: Ethereal от 17.05.03, 10:59:38
Я редактирую существующий. И еще после отработки библиотеки он говорит "Неверный указатель массива"..
Название: Re:ksLDimParam
Отправлено: ethereal от 19.05.03, 13:19:22
Кстати, то же самое происходит и при использовании ksRDimParam...
Название: Re:ksLDimParam
Отправлено: Zashibuka от 20.05.03, 07:40:05
Письмом ответить не получилось ... не отправляется ...
Навскидку - компас очень чувствителен очень к операциям с памятью - то
есть следует выделять память под массивы строк принудительно перед
считыванием оного... по крайней мере я очень с этим намучился поначалу
(я пишу на Delphi).

Следующий момент - вспоминается что и я с этими DimParam-ами намучился
из за того что там несколько уровней вложенности этих текстовых массивов...
бабка за дедку , внучка за бабку ...

почитал хелп сечас и подумал ещё :
GetTextArr(); возвращает не МАССИВ (указатель на начало массива) , а
  УКАЗАТЕЛЬ на ИНТЕРФЕЙС
динамического массива ksDynamicArray строк типа CHAR_STR_ARR или TEXT_LINE_ARR.
а у него есть свои методы

(ksDeleteArray ksClearArray ksGetArrayCount ksGetArrayType
ksExcludeArrayItem ksAddArrayItem ksGetArrayItem ksSetArrayItem)

может через них надо ?

Название: Re:ksLDimParam
Отправлено: ethereal от 27.05.03, 22:52:03
Спасибо за готовность помочь, с помощью Аскона разобрался. Дело было во флагах для ksGetObjParam. Насчет ksDynamicArray верно, я так и делал. Но все равно, я готов их убить за то, что они придумали этот массив. Я не понял, какой в этом смысл, кроме сомнительных преимуществ экономии памяти? Неужели нельзя было фиксированную структуру сделать? Я столько "удовольствия" получил, отлаживая логику, которая на основании этих флагов выцепает размер, а что касается его изменения, то до сих пор решиться не могу до конца довести метод.

Здесь назревает небольшой инструментарийчик для тех, кто пишет под .NET. Так, обертки для классов, константы и еще предполагаю написать несколько классов, облегчающих работу с компасовскими атрибутами, размерами теми же и с другими вещами, которые явно разрабатывались "для человека"... Так что милости просим заинтересованных лиц, связывайтесь, и помощь мне тоже пригодится, обертки пока не фонтан...
Название: Re:ksLDimParam
Отправлено: Skiff от 28.05.03, 14:46:04
А вы можете создать динамический массив и присваивать его элементам значения разных типов?
Название: Re:ksLDimParam
Отправлено: ethereal от 29.05.03, 16:10:49
Не понял?
Название: Re:ksLDimParam
Отправлено: Sabahs от 26.08.03, 06:44:07
Попробуйте так

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);