Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программная установка формата листа в AutoCAD 
:(
    Опции темы
Ptica_Oz
Дата 1.3.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Доброго времени суток.
Обращаюсь к вам, как мне кажется, с не тривиальной проблемой. А если вам так не кажется, то развейте, пожалуйста, моё заблуждение.
В целом задача состоит в следующем: есть чертеж неопределённого формата в пространстве модели. Надо написать прогу (чем я и занимаюсь) в которой только выбираешь принтер и отправляешь на печать. Программа выполняет следующее: сканирует пространство модели и определяет размеры чертежа, затем выставляет необходимые для печати параметры и отправляет на печать.
Возникла загвоздка с одним параматром: Paper size, в котором указывается формат страницы.
Несколько раз натыкалась на утверждение "AutoCAD берет информацию о доступных размерах листа от драйвера принтера". Научилась получать список форматов из драйвера (правда список полностью не совпадает с автокадовским, но я думаю это не проблема...). Теперь мне надо передать этот формат в Автокад таким образом чтобы в поле Paper size стояло это название.
Также находила примеры кода (восновном на VB) с использованием функций CanonicalMediaName и CanonicalMediaNames (вторую ф-цию в С++ не нашла, может конечно плохо искала). Использование ф-ции CanonicalMediaName нужного эффекта не даёт.
Не исключаю того, что и функции я не те пользую и список форматов.
Вобщем вопрос заключается в том, как программно установить формат листа.
Буду признательна за помощь.

З.Ы. список форматов получаю функцией спула (winspool.h) DeviceCapabilities. в сети нашла програмку winprinfo с исходником, получение списка взяла от туда

Несколько строк кода:

Код

#include "Windows.h"
#include "winspool.h"
#include "stdafx.h"

#import "C:\Program Files\Common Files\Autodesk Shared\acax16enu.tlb" rename_namespace ("ACad")

using namespace ACad;

ACad::IAcadModelSpacePtr Model;
_bstr_t PaperSize; //строка в которой хранится название необходимого формата, выбранного изсписка
...
Model = AutoCAD->ActiveDocument->ModelSpace;
Model->Layout->put_CanonicalMediaName(PaperSize);

PM MAIL   Вверх
Ptica_Oz
Дата 1.3.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Функций CanonicalMediaName и CanonicalMediaNames нашла, и ещё одну (судя по VB-шным кодам нужную) GetLocaleMediaName (и куда я смотрела?  smile ). Теперь пытаюсь VB-шный код, который по видемому выполняет нужные мне операции, перевести в С++

Код

Dim New_Layout As AcadLayout
Dim LocalName As String
Dim Formats As Variant
Dim Element As Variant
Dim Name As String

Set Layout = ThisDrawing.Layouts.Add("New_Layout")

LocalName = "A4 (210x297mm)" 'as example for the local name

Formats = New_Layout.GetCanonicalMediaNames

For Each Element In Formats
Name = New_Layout.GetLocaleMediaName(Element)
If InStr(1, Name, LocalName, vbTextCompare) = 1 Then
New_Layout.CanonicalMediaName = Element
End If
Next Element

PM MAIL   Вверх
Ptica_Oz
Дата 2.3.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



перевела!
Код

BSTR HUGEP *CanonicalNames;
_bstr_t LocaleName;
long ind;
long size;
variant_t vPaperSize;
ACad::IAcadModelSpacePtr Model;

Model = AutoCAD->ActiveDocument->ModelSpace;
vPaperSize = Model->Layout->GetCanonicalMediaNames();
        
SafeArrayAccessData(vPaperSize.parray,(void HUGEP* FAR*)&CanonicalNames);

SafeArrayGetUBound(vPaperSize.parray, 1, &size); 
for(ind=1; ind < size; ind++){
    LocaleName = Model->Layout->GetLocaleMediaName(CanonicalNames[ind]);
        
    if(strstr((const char *)LocaleName, PaperSize) ){
        Model->Layout->put_CanonicalMediaName(CanonicalNames[ind]);
        break;
    }
}
SafeArrayUnaccessData(vPaperSize.parray);

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0390 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.