OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 16 Апрель, 2024 08:40

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 08 Март, 2006 11:56 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Здравствуйте.
Попробовал из Blackbox зайти в автокад. С английскими буквами все в порядке, с русскими - проблемы. Может быть, ответ следует искать на форуме autocad.ru?
Заранее благодарю.
С уважением, Кубаныч.

MODULE testacad;
IMPORT Log := StdLog,
acad:=CtlAutoCAD (*получен через DevComInterfaceGen из
D:\Programs\Common Files\Autodesk Shared\acax16enu.tlb

с ручным комментированием и последующим неиспользованием одного
сбойного места*)

, WinOleAut, CtlT;

PROCEDURE Cart (x,y,z:REAL ):CtlT.RealArray;
VAR
arr:ARRAY 3 OF REAL;
dot:CtlT.RealArray;
BEGIN
arr[0]:=x;arr[1]:=y;arr[2]:=z;
dot:=CtlT.RealArr(arr);

RETURN dot;
END Cart;

PROCEDURE run* ( );
VAR
vot:acad.IAcadApplication;
doc:acad.IAcadDocument;
sloi:acad.IAcadLayer;
slois:acad.IAcadLayers;
model:acad.IAcadModelSpace;

str:ARRAY 256 OF CHAR;

text:acad.IAcadText;
line:acad.IAcadLine;



BEGIN
vot:=acad.NewAcadApplication();
IF vot#NIL THEN

vot.PUTVisible(TRUE);

doc:=vot.ActiveDocument();
slois:=doc.Layers();
sloi:=slois.Add('Jalil');
sloi:=slois.Add('Akjol');
sloi:=slois.Add('Sergei');
sloi:=slois.Add('Eugen');
sloi:=slois.Add('Dauren'(*Здесь русские буквы приводят к ТРАПу*) );

model:=doc.ModelSpace();

text:=model.AddText(
'Salam' (*здесь русские буквы приводят к неправильному отображению в автокаде*)
, Cart(0,10,0) ,20);

line:=model.AddLine( Cart(0,10,0) , Cart(100,10,0) );
line.PUTcolor(acad.acGreen);
line.Update;

END;
END run;

BEGIN
END testacad.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 08 Март, 2006 12:16 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну, что можно сказать...
А не приведете сигнатуру метода Add - какую строку он принимает, 1- или 2-байтовую? И стоит, наверное, узнать на автокадовском форуме - какой кодировки ждет автокад?

Если Вы передаете строковую константу - то она всегда идет в win cp1251-кодировке, т.к. константы хранятся в 8-битовой форме. Т.е. даже если она приводится к 2-байтовой WSTR, то русские символы кодируются не Юникодом, а в диапазоне 127...255. Возможно, это приводит к проблеме.
Попробуйте передавать не через константу, а через переменную, при этом вот таким образом:
Код:
 IMPORT National (* Это модуль русификации ядра *)

...
 VAR s: ARRAY 256 OF CHAR;
        i: INTEGER;
  BEGIN
    s := 'Русский текст'; (* сейчас в s лежит текст в win-сp1251-кодировке *)
   FOR i := 0 TO LEN(s$) -1 DO
       s[i] := National.ConvertToUnicode(s[i])
   END;
  (* вот теперь текст в s лежит в настоящем юникоде *)
  (* и теперь уже передаем в Автокад *)
  yourCOMObject.Add(s)
 


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 08 Март, 2006 13:08 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Строки двухбайтовые.

PROCEDURE (this: IAcadLayers) Add* (Name: ARRAY OF CHAR): IAcadLayer, NEW;
(* Creates a member object and adds it to the appropriate collection *)
VAR arg: ARRAY 1 OF CtlT.Variant; ret: CtlT.Variant;
BEGIN
CtlC.StrVar(Name, arg[0]);
CtlC.CallParMethod(this, 2, arg, ret);
RETURN ThisIAcadLayer(CtlC.VarAny(ret))
END Add;

PROCEDURE ThisIAcadLayers* (v: CtlT.Any): IAcadLayers;
VAR new: IAcadLayers;
BEGIN
IF v # NIL THEN
NEW(new); CtlC.InitObj(new, v, "{C347DCBD-D10D-4E35-8509-463A47F6F197}"); RETURN new
ELSE RETURN NIL
END
END ThisIAcadLayers;


----------------------------------------

PROCEDURE (this: IAcadModelSpace) AddText* (TextString: ARRAY OF CHAR; InsertionPoint: CtlT.Any; Height: REAL): IAcadText, NEW;
(* Creates a single line of text *)
VAR arg: ARRAY 3 OF CtlT.Variant; ret: CtlT.Variant;
BEGIN
CtlC.StrVar(TextString, arg[2]);
CtlC.AnyVar(InsertionPoint, arg[1]);
CtlC.RealVar(Height, arg[0]);
CtlC.CallParMethod(this, 1572, arg, ret);
RETURN ThisIAcadText(CtlC.VarAny(ret))
END AddText;


PROCEDURE ThisIAcadText* (v: CtlT.Any): IAcadText;
VAR new: IAcadText;
BEGIN
IF v # NIL THEN
NEW(new); CtlC.InitObj(new, v, "{E3FD8511-58AF-43D4-9B16-C6941F7B245F}"); RETURN new
ELSE RETURN NIL
END
END ThisIAcadText;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 08 Март, 2006 13:17 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Все заработало, спасибо.

Надо, оказывается, строки отправлять в Юникоде.

С уважением,
Кубаныч.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB