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

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

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

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

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

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

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

ksLDimParam

Автор Ethereal, 12.05.03, 11:33:12

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

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

Ethereal

С помощью ksLDimParam->GetTPar получаю ksDimTextParam
Почему метод GetTextArr() возвращает массив нулевой длины?

Дааа, а форум тут оживленный. За 10 последних дней ни одной новой реплики...

Skiff

А ты содаешь размер, или редактируешь существующий объект?

Ethereal

Я редактирую существующий. И еще после отработки библиотеки он говорит "Неверный указатель массива"..

ethereal

Кстати, то же самое происходит и при использовании ksRDimParam...

Zashibuka

Письмом ответить не получилось ... не отправляется ...
Навскидку - компас очень чувствителен очень к операциям с памятью - то
есть следует выделять память под массивы строк принудительно перед
считыванием оного... по крайней мере я очень с этим намучился поначалу
(я пишу на Delphi).

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

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

(ksDeleteArray ksClearArray ksGetArrayCount ksGetArrayType
ksExcludeArrayItem ksAddArrayItem ksGetArrayItem ksSetArrayItem)

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


ethereal

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

Здесь назревает небольшой инструментарийчик для тех, кто пишет под .NET. Так, обертки для классов, константы и еще предполагаю написать несколько классов, облегчающих работу с компасовскими атрибутами, размерами теми же и с другими вещами, которые явно разрабатывались "для человека"... Так что милости просим заинтересованных лиц, связывайтесь, и помощь мне тоже пригодится, обертки пока не фонтан...

Skiff

А вы можете создать динамический массив и присваивать его элементам значения разных типов?

ethereal

Не понял?

Попробуйте так

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