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

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

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

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

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

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

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

Текст из размера

Автор Wiscont, 09.05.18, 20:01:14

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

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

Wiscont

09.05.18, 20:01:14 Последнее редактирование: 09.05.18, 20:17:37 от Wiscont
Всем Здравствуйте!
CBuilder
Код взял прямо из примера SDK
Не могу получить текст из автоматически проставленного размера (_AUTONOMINAL)
Если убрать флаг Авто, то размер читается. Если флаг оставить, то текст в ячейке Значение размера не читается, при этом остальные ячейки (допуск, единица измерения) читаются. А количество элементов в массиве при включенном флаге Авто на единицу меньше чем есть, т.е считаются все кроме Значения размера


if ( GetObjParam(rObject,0,0,0) == LDIMENSION_OBJ ) {
    
LDimParam parLDim; // Структура параметров линейного размера
memset( &parLDim, 0, sizeof( parLDim ) );

GetObjParam( rObject, &parLDim, sizeof( parLDim ), DIM_TEXT_PARAM );

DimText * pParDimText; // Структура параметров размерной надписи
pParDimText = ( DimText * )&parLDim;  // DIM_TEXT_PARAM

char buf[255];
char buf1[255], buf2[255];
buf1[0] = '\0';   
   
// Размерная надпись 
if ( pParDimText ) {

// Количество элементов в массиве
int count = GetArrayCount( pParDimText->pText );

// Цикл по строкам
for ( int i = 0; i < count; i++ ) {

// Получить значение элемента массива
GetArrayItem( pParDimText->pText, i, buf2, 255 );
strcat( buf1, buf2 );
strcat( buf1, "\t" );
} // for

sprintf( buf, "%s \n\n count = %d \t bitFlag = %d \t sign = %d",
buf1, count, pParDimText->bitFlag, pParDimText->sign );
Message( buf );
}   //  if pParDimText
}   //  if GetObjParam

plscomeback

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

Wiscont

09.05.18, 22:38:24 #2 Последнее редактирование: 09.05.18, 23:16:50 от Wiscont
думаю это ее значение LDIMENSION_OBJ, а функция GetObjParam (аргументы)
Пытаюсь отключить флаг, но вместе с флагом пропадает и само значение размера
parLDim.tPar.bitFlag = 0;
SetObjParam( rObject, &parLDim, sizeof( parLDim ), DIM_TEXT_PARAM );

Как определить флаг stringFlag ???

Может глянуть в сторону API7, интерфейс - IDimensionText.
Или делать так parLDim.tPar.SetBitFlagValue(_AUTONOMINAL,False);.
PS. Так, как bitFlag это набор флагов, Вы данным выражением parLDim.tPar.bitFlag = 0;, обнуляете все флаги.
+ Благодарностей: 2

Slaviation

Ниже пример на Python для активного чертежа, содержащего линейный размер.
В примере используется API5, которое более "созвучно" с API экспортных функций, используемым автором поста.
У размера определяется значение битового флага _AUTONOMINAL, и в зависимости от него - значение размера.

# -*- coding: utf-8 -*-

http://forum.ascon.ru/index.php/topic,31359.msg250505.html#msg250505
#  Не могу получить текст из автоматически проставленного размера (_AUTONOMINAL)

import pythoncom
from win32com.client import Dispatch, gencache
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))

#~ Найди линейный размер
ks_document_2d = kompas_object.ActiveDocument2D()
iterator = kompas_object.GetIterator()
iterator.ksCreateIterator(kompas6_constants.ksDrLDimension, 0)
ldim_reference = iterator.ksMoveIterator("F")
iterator.ksDeleteIterator()

#~ Определи значение битового флага _AUTONOMINAL
ks_ldim_param = kompas_object.GetParamStruct(kompas6_constants.ko_LDimParam)
ks_document_2d.ksGetObjParam(ldim_reference, ks_ldim_param, kompas6_constants.ksAllParam)
ks_dim_text_param = ks_ldim_param.GetTPar()

if ks_dim_text_param.GetBitFlagValue(1): #~ _AUTONOMINAL = 1
    ks_double_value = kompas_object.GetParamStruct(kompas6_constants.ko_DoubleValue)
    ks_document_2d.ksGetObjParam(ldim_reference, ks_double_value, 3) #~ DIM_VALUE
    print("_AUTONOMINAL on, value = ", str(ks_double_value.value))
else:   
    ks_dim_text_param.stringFlag = 0
    text_arr = ks_dim_text_param.GetTextArr()
    ks_char_255 = kompas_object.GetParamStruct(kompas6_constants.ko_Char255)
    text_arr.ksGetArrayItem(0, ks_char_255)
    print("_AUTONOMINAL of, value = ", ks_char_255.str)
+ Благодарностей: 2

Wiscont

на запрос
pParDimText->GetBitFlagValue(_AUTONOMINAL)
parLDim.tPar.GetBitFlagValue(_AUTONOMINAL)
пишет ошибка E2316 'GetBitFlagValue' is not a member of 'DimText'
пришлось перейти на Automation

char buf[255];
double x, y;
reference pObj;

ksLDimParam * param = (ksLDimParam*)kompas->GetParamStruct( ko_LDimParam );
ksDimTextParam * tPar = (ksDimTextParam*)param->GetTPar();

doc->ksCursor( param, &x ,&y, 0 );
if( doc->ksExistObj(pObj = doc->ksFindObj( x, y, 1e6 )) ){

if ( doc->ksGetObjParam( pObj, 0, 0 ) == LDIMENSION_OBJ){

doc->ksGetObjParam( pObj, param, ALLPARAM );

::sprintf( buf, "%d", tPar->GetBitFlagValue( _AUTONOMINAL ));
kompas->ksMessage( StringToOleStr(buf) );

} // if ksGetObjParam
} // if FindObj

Wiscont

12.05.18, 12:42:45 #6 Последнее редактирование: 12.05.18, 13:45:32 от Wiscont
Прошу помочь, что не так делаю

Печатает только первый символ строки

//обозначил объект
reference pObj;

ksLDimParam * param = (ksLDimParam*)kompas->GetParamStruct( ko_LDimParam ); // структура размера
ksDimTextParam * tPar = (ksDimTextParam*)param->GetTPar(); // структура надписи размера от parm

ksDynamicArray * arrText = (ksDynamicArray*)tPar->GetTextArr(); //динамический массив из данных tPar
ksChar255 * str = (ksChar255*)kompas->GetParamStruct(ko_Char255);

// указал объект
doc->ksCursor( param, &x ,&y, 0 );
if( doc->ksExistObj(pObj = doc->ksFindObj( x, y, 1e6 )) ){

//поместил данные объекта в указатель структуры размера, а та в структуру надписи размера
doc->ksGetObjParam( pObj, param, ALLPARAM );

//передал первую строку динамического массива указателю str
arrText->ksGetArrayItem(0, str);

::sprintf( buf, "%s", str->get_str() );
kompas->ksMessage( StringToOleStr(buf) );

Можно так, однако в случае с ksChar255 все же не понятно ...???

ksTextLineParam* linePar = (ksTextLineParam*)kompas->GetParamStruct( ko_TextLineParam );
ksTextItemParam* itemPar = (ksTextItemParam*)kompas->GetParamStruct( ko_TextItemParam );

tPar->stringFlag = 1;

doc->ksGetObjParam( pObj, param, ALLPARAM );

arrText->ksGetArrayItem(0, linePar);
ksDynamicArray* itemArr = (ksDynamicArray*)linePar->GetTextItemArr();
itemArr = (ksDynamicArray*)linePar->GetTextItemArr();
int count = itemArr->ksGetArrayCount();
itemArr->ksGetArrayItem( 0, itemPar );

::sprintf( buf, "%s", WideCharToString(itemPar->s) );

Wiscont

в конце сделал как писал Slaviation

ksDoubleValue  * pDouble = (ksDoubleValue*)kompas->GetParamStruct( ko_DoubleValue );
doc->ksGetObjParam( pObj, pDouble, DIM_VALUE );
::sprintf( buf, "%.1f", pDouble->get_value() );

я не спец в программировании и мне не понятно, почему в справке описано свойство value
как  value = iDoubleValue.GetValue()
а на практике я не могу передать данные массиву
ksDynamicArray* itemArr = (ksDynamicArray*)pDouble->GetValues();

вопрос с ksChar255 опять же я не могу решить
так данный метод дает первый символ в строке

Wiscont

noAutomation

LDimParam parLDim; // Структура параметров линейного размера
memset( &parLDim, 0, sizeof( parLDim ) );

GetObjParam( rObject, &parLDim, sizeof( parLDim ), ALLPARAM );
// получить значение флага, если  0 - noAuto 1 - Auto
if(parLDim.tPar.bitFlag % 2 == 0)
{
// _PREFIX  или no_PREFIX
if (parLDim.tPar.bitFlag % 8 == 0 && parLDim.tPar.bitFlag != 4 || parLDim.tPar.bitFlag == 0) GetArrayItem( parLDim.tPar.pText, 0, buf, 255 );
else GetArrayItem( parLDim.tPar.pText, 1, buf, 255 );
} // if
else
{
//получить значение авторазмера
double pDouble;
GetObjParam( rObject, &pDouble, sizeof( pDouble ), DIM_VALUE );
sprintf( buf, "%.1f ", pDouble );
} // else
Message( buf );