CAD-страница НП | Статьи | English | Download

А.Н.Ривилис. Рекомендация для миграции - тип данных AcString

Продолжим разговор о переводе ARX-приложений под AutoCAD 2007.
Для строковых объектов в ObjectARX версий 2006 и 2007 имеется специальный класс (тип данных) - AcString, который объявлен в файле AcString.h (в версии 2005 и более ранних такого типа нет). Описание текстовой строки с использованием упомянутого класса выглядит следующим образом:

AcString str;

Этот тип данных очень похож на типы CString (из библиотеки MFC) и std::string (из стандартной библиотеки - STL), но, в отличие от них, позволяет оперировать как строками, содержащими char, так и строками, содержащими wchar_t. Класс AcString имеет конструкторы, позволяющие создавать строки как типа char, так и типа wchar_t, например:

AcString sa("Строка символов char");
AcString sw(_T("Строка символов wchar_t"));

С помощью соответствующего конструктора можно создать пустую строку или строку, инициализируемую одним символом типа char или wchar_t.
Тип AcString облегчает преобразования между типами char и wchar_t, например:

const char *pStrA1 = sa.kszPtr();

или

const char *pStrA2 = sa; // неявно вызывается (const char *)sa;
const wchar_t *pStrW1 = sa.kwszPtr();
const wchar_t *pStrW2 = sa; // неявно вызывается (const wchar_t *)sa;

Кроме того, этот класс содержит операторы/функции конкатенации строк, поиска и выделения подстрок, получения длины строки, форматирования, преобразования в число и т. д. и т. п. Использование типа AcString в подавляющем большинстве случаев позволяет писать код, который будет работать как в AutoCAD 2006, так и в AutoCAD 2007, и последующих.
Например, такая запись правильно сработает в обоих версиях AutoCAD:

acedPrompt (AcString("\nПечатаем строку"));

Следует быть осторожным только при вызове функций с переменным число аргументов ≈ например, acutPrintf с числом аргументов больше одного, а также acedCommand, acutBuildList, т.к. компилятор не в состоянии однозначно понять, какой тип следует передать. В этом случае предпочтительнее использовать методы AcString::kszPtr() или AcString::kwszPtr() для явной идентификации типа данных. На основе этого класса очень удобно делать макросы для передачи нужного типа в функции, например:

#ifndef INC_UNI_H
    #include <AcString.h>
#define INC_UNI_H
  #if defined(ACADR17)
 // Конвертация из UNICODE в ANSI
    #define W2C(x) ((const char    *)AcString(x))
 // Конвертация из ANSI в UNICODE
    #define C2W(x) ((const wchar_t *)AcString(x))
  #else
    #define W2C(x) (x)
    #define C2W(x) (x)
  #endif
#endif

Если при компиляции проекта с помощью ObjectARX 2006 установлен идентификатор препроцессора ACADR16, а при компиляции с помощью ObjectARX 2007 - ACADR17, то строки

char *str1 = "\nПечатаю строку <%s>";
char *str2 = "---моя строка---";
acutPrintf(C2W(str1), C2W(str2));

будут скомпилированы и отработают правильно в обеих версиях AutoCAD.
Аналогично скомпилируется без ошибок и нормально выполнится следующее выражение:

acedCommand (RTSTR, C2W("_.LINE"), RTSTR, C2W("0,0"), RTSTR, C2W("10,10"), RTNONE);


CAD-страница НП | Статьи | English | Download