Перейти к содержанию

Рекомендуемые сообщения

Здравствуйте!

Подскажите пожалуйста последовательность, в которой можно задавать параметры печати при вызове команды PLOT

 

Например, в автокаде было и работало так:

'_plot - команда'
'Y - выполнить детальное задание конфигурации или нет'
'Model - имя пространства откуда идет печать (Model или название конкретного листа)'
'plot_name - имя устройства вывода'
'FA - формат листа бумаги'
'М - ед.измерения миллиметры'
'AorK - ориентация чертежа'
'N - перевернуть чертеж или нет'
'Р - печатаемая область Рамка'
'strPt1 и strPt2 - лев. ниж угол и прав. верх. угол рамки'
'mashtab - вписать или масштаб печати (N:M -> N=M)'
'str_xy - центрировать или смещение от начала (пример:  5.00,0.00 - смещение по х на 5 мм, по y на 0мм)'
'Д/Н - учитывать стили печати или нет'
'ctb - имя таблицы стилей печати'
'Д/Н - учитывать веса линий'
'О - Обычный режим вывода раскрашенных видовых экранов'
'Н - НЕ запись чертежа в файл'
'Д/Н - сохранять или нет изменения параметров листа'
'Д/Н - перейти к печати или нет'
	str_cmd = "(command ""_plot"" ""Y"" ""Model"" """ & plot_name & """ """ & FA & """ ""M"" """ & AorK & """ " _
			& " ""N"" ""Р""  """ & strPt1 & """ """ & strPt2 & """ " _
			& " """ & mashtab & """ """ & str_xy & """ ""Д"" """ & CTB & """ ""Д"" ""О"" " _
			& " ""Н"" ""Д"" ""Н"")" & " "
	ThisDrawing.SendCommand str_cmd

Ссылка на сообщение
Поделиться на другие сайты

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

 

другими словами, как миновать стандартное окно печати

Изменено пользователем ich-frau
Ссылка на сообщение
Поделиться на другие сайты

Если не через команды, то можно использовать Document.Plot. Но у нас этот объект не реализован. Записал в багтрекер Клуба разработчиков пожелания о создании консольной версии команды PLOT и о реализации интерфейса IAcadPlot.

Ссылка на сообщение
Поделиться на другие сайты

Document.Plot. Но у нас этот объект не реализован.

Да, я заметила ((

 

Бум ждать, но пока другие вопросы:

Set olayt = ThisDrawing.ActiveLayout
'задание области печати'
Set ut = ThisDrawing.Utility
pt1 = ut.GetPoint("0,0,0", "ВЫБЕРИТЕ РАМКОЙ ПЕЧАТАЕМУЮ ОБЛАСТЬ:")
pt2 = ut.GetCorner(pt1, "ВТОРАЯ ТОЧКА:")
olayt.SetWindowToPlot pt1, pt2 ' Устанавливает координаты, которые определяют область печати'
olayt.PlotType=4 'Рамка'
olayt.ConfigName="\\ko-server1\Canon iPF710"
olayt.StyleSheet="monochrome.ctb" 'стиль печати'
olayt.StandardScale=16 '16 - 1:1 ,  0 - вписать'
olayt.RefreshPlotDeviceInfo

 

1. область печати всеравно не задается видимо верно, пусто в просмотре показывает

2. какими свойствами задать ориентацию (альбомная, книжная) и размер бумаги (А3, А2 и т.д. из списка, эти форматы ранее созданы в Сервис->настройка->Форматы бумаги)?

Ссылка на сообщение
Поделиться на другие сайты

Записал в багтрекер Клуба разработчиков пожелания о создании консольной версии команды PLOT

А они что, не для всех команд консольные версии реализуют?
Ссылка на сообщение
Поделиться на другие сайты

Когда писались команды было, увы, не до их консольных версий. Теперь мы их планомерно дописываем.

 

Пожелания в Клубе разработчиков влияют на приоритеты, милости просим в Клуб.

Ссылка на сообщение
Поделиться на другие сайты

Да как бы название "клуб разработчиков" предполагает не только поиск багов и недочетов, но и непосредственное участие в разработке.

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

К тому же сидение на бесплатной версии быстро приучает на не сильно мешающие баги просто внимания не обращать.

Изменено пользователем amk
Ссылка на сообщение
Поделиться на другие сайты

Несмотря на своё название, это Клуб разработчиков (приложений под) nanoCAD, а не клуб разработчиков nanoCAD-а как такового.

Ссылка на сообщение
Поделиться на другие сайты
  • 4 недели спустя...

Я снова вернулась к SetWindowToPlot.

pt1 = ut.GetPoint("0,0,0", "ВЫБЕРИТЕ РАМКОЙ ПЕЧАТАЕМУЮ ОБЛАСТЬ:")
pt2 = ut.GetCorner(pt1, "ВТОРАЯ ТОЧКА:")
olayt.SetWindowToPlot pt1, pt2
olayt.PlotType = 4

 

Как выяснилось, область печати то задается, только не там где надо, совсем в стороне от выбранной области, но тех же размеров. Случайно заметила при удачном масштабе рисунка (когда окно печати открыто, на чертеже в это время красным и синим границы области и выбранного формата показываются), до этого просто выпадало за границы экрана, я и не видела, думала совсем не работает, раз пусто на просмотре выдает.

 

Так вот в чем же дело?

Обратила внимание, что в момент выбора точек координаты точки в лев.нижнем углу из классического вида X,Y,Z превращаются в Число < Число (в автокаде, где все работает как надо в этом плане, точка остается в виде х,y,z), не из-за этого ли происходит неправильное формирование области в SetWindowToPlot? т.е. не в тех координатах откладывает, я в этом ноль. Подскажите в каком ритме в какую сторону танцевать?

post-44563-0-63816900-1355312739.jpg

Изменено пользователем ich-frau
Ссылка на сообщение
Поделиться на другие сайты

а еще зависит выставление этой обалсти от вида на экране, в зависимости от приближения/удаления печатаемого объекта область в красной рамке тоже прыгает то ближе к нему, то дальше от него

 

и все это касается пространства модели, попробовала на листе, там все нормально, область задается так как надо

Изменено пользователем ich-frau
Ссылка на сообщение
Поделиться на другие сайты

Виду диалог сама с собой ))))

 

И так решение! Ура! благодаря вот этой теме на др. форуме

pt1 = ut.GetPoint("0,0,0", "ВЫБЕРИТЕ РАМКОЙ ПЕЧАТАЕМУЮ ОБЛАСТЬ:")
pt2 = ut.GetCorner(pt1, "ВТОРАЯ ТОЧКА:")

Dim vp
Dim vp_tochka
Set vp = ThisDrawing.ActiveViewport
ut.CreateTypedArray vp_tochka, 5, 0, 0,0
vp.Target = vp_tochka
ThisDrawing.ActiveViewport = vp
ThisDrawing.Regen 1  'acAllViewports'

olayt.SetWindowToPlot pt1, pt2
olayt.PlotType = 4

 

Ну что, почти все что нужно я в окно печати передаю, осталось теперь выяснить а можно ли туда передать нужный формат и задать ориентацию? (это выбор в списке форматов в секции Размер и ориентация бумаги)

Изменено пользователем ich-frau
Ссылка на сообщение
Поделиться на другие сайты

да... с автоматической печатью беда...

тоже волнует эта животрепещущая тема!

в .NET API всё ещё хуже - вообще нет реализации... или я не там ищу?

Ссылка на сообщение
Поделиться на другие сайты

в .NET API всё ещё хуже - вообще нет реализации... или я не там ищу?

 

Увы, там. Пространство имён PlottingServices не реализовано. Записал в Клубе разработчиков пожелание #59.

Ссылка на сообщение
Поделиться на другие сайты

Ну что продолжим ))))

 

За передачу в окно печати формата бумаги отвечает CanonicalMediaName, только выдает оно название в своем понимании (например, User1). Используя GetLocaleMediaName(CanonicalMediaName) , можно получить привычное, отображаемое в списке форматов принтера имя.

Используем перебор с помощью GetCanonicalMediaNames

Set olayt = ThisDrawing.ActiveLayout
olayt.ConfigName="PDFCreator"
olayt.RefreshPlotDeviceInfo
Retval=ThisDrawing.Utility.CreateSafeArrayFromVector(olayt.GetCanonicalMediaNames())
For Each r In Retval
   'для примера ищем формат СНГП_A0'	  
	if (olayt.GetLocaleMediaName(r) = "СНГП_A0") Then
		olayt.CanonicalMediaName = r
		Exit For
	End If
Next

Формат СНГП_A0 имеется в выпадающем списке форматов, его я сделала как тут говорилось.

 

 

PS я уж была начала писать, что опять не работает как надо, а оказывается снова забыла про особенность массивов тут, что нужно использовать CreateSafeArrayFromVector ))))

Ссылка на сообщение
Поделиться на другие сайты

ну с ориентацией пок атолько так:

1. форматы нужно наделать альбомные и книжные (например, AN_альб размером WxH, где W>H, тогда АN_книж будет HxW)

2. тогда после присвоения формата через CanonicalMediaName и открытия окна печати, там будет ориентация альбомная или книжная в зависимости от заданных ширины и высоты установленного формата

 

PS при чем если вы сами в окне будете менять формат, флажок ориентации не будет переключаться...

Изменено пользователем ich-frau
Ссылка на сообщение
Поделиться на другие сайты

Пример программной настройки параметров печати:

 

var myPlotConfig;
try {
 myPlotConfig = ThisDrawing.Database.PlotConfigurations("myConfig");
} catch (ex) {
 myPlotConfig = ThisDrawing.Database.PlotConfigurations.Add("myConfig", true);
 myPlotConfig.Name = "myConfig";
}
setupPlotConfig(myPlotConfig);

echo("ThisDrawing.Database.PlotConfigurations.Count=" + ThisDrawing.Database.PlotConfigurations.Count)
for_each(ThisDrawing.Database.PlotConfigurations, function(config) {
 echo("Name=" + config.Name)
 echo("ConfigName=" + config.ConfigName);
 echo("CanonicalMediaName=" + config.GetLocaleMediaName(config.CanonicalMediaName));
 echo("PaperUnits=" + config.PaperUnits);
})

function setupPlotConfig(config) {
 config.RefreshPlotDeviceInfo();
 var vbDevNames = new VBArray(ThisDrawing.Utility.CreateSafeArrayFromVector(config.GetPlotDeviceNames()));
 var devNames = vbDevNames.toArray();
 for (var idx = 0; idx < devNames.length; ++idx)
echo(idx + ": " + devNames[idx])
 try {
var idx = ThisDrawing.Utility.GetInteger("Enter device index");
if (idx >= 0 && idx < devNames.length)
  config.ConfigName = devNames[idx];
 }
 catch (ex) {
//config.ConfigName = devNames[0];
 }
 var vbMediaNames = new VBArray(ThisDrawing.Utility.CreateSafeArrayFromVector(config.GetCanonicalMediaNames()))
 var mediaNames = vbMediaNames.toArray();
 for (var idx = 0; idx < mediaNames.length; ++idx)
echo(idx + ": " + config.GetLocaleMediaName(mediaNames[idx]))
 try {
var idx = ThisDrawing.Utility.GetInteger("Enter media name index");
if (idx >= 0 && idx < mediaNames.length)
  config.CanonicalMediaName = mediaNames[idx];
 }
 catch (ex) {
//config.CanonicalMediaName = mediaNames[0];
 }
 config.PlotOrigin = "10,0"
 config.PaperUnits = acMillimeters
 config.PlotType = acExtents
 config.PlotRotation = ac90degrees
 config.StandardScale = acVpScaleToFit
 config.StyleSheet = "monochrome.ctb"
 config.PlotWithPlotStyles = true
 config.PlotWithLineweights = true
}

function plotConfigToString(config) {
 var str = "";
 str += "Name=" + config.Name + "\r\n";
 str += "ConfigName=" + config.ConfigName + "\r\n";
 str += "CanonicalMediaName=" + config.CanonicalMediaName + "\r\n";
 str += "PaperUnits=" + config.PaperUnits + "\r\n";
}

function echo(msg) {
 ThisDrawing.Utility.Prompt(msg);
}
function for_each(coll, func) {
 for (var enu = new Enumerator(coll); !enu.atEnd(); enu.moveNext())
func(enu.item());
}
function for_each_if(coll, func) {
 for (var enu = new Enumerator(coll); !enu.atEnd(); enu.moveNext()) {
if (!func(enu.item()))
  return false;
 }
 return true;
}

Ссылка на сообщение
Поделиться на другие сайты

config.PlotRotation = ac90degrees

называется смотрю в книгу, вижу фигу )))

это про то как я искала как же ориентацию то задать, залезла полсе этого поста в справку и вот же он, почему до этого не видела его....

Ссылка на сообщение
Поделиться на другие сайты
  • 3 месяца спустя...

Пример программной настройки параметров печати:

а как это на печать программно запустить?

Ссылка на сообщение
Поделиться на другие сайты

Вот что получилось у меня на данный момент.

Можно выбрать любые объекты в модели. Если среди них есть рамка (блок КЖ-А1), то автоматически формируется новый лист с видовым экраном, настроенным на эту рамку. Листы других форматов - по аналогии.

Из минусов - никак не могу придумать, как бы это всё отсортировать...

Изменено пользователем swell{d}
Ссылка на сообщение
Поделиться на другие сайты

Всё, я доделал. Пользуйтесь

 

Автоматическое создание листов для чертежей, оформленных в модели:

_http://fordewind.org/wiki/doku.php?id=%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82_%D0%BB%D0%B8%D1%81%D1%82%D1%8B

 

Я считаю, что это гениально и просто обязано так или иначе быть реализовано в нанокаде спдс для стандартных спдс форматок.

 

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

 

Изменено пользователем swell{d}
Ссылка на сообщение
Поделиться на другие сайты

Такой вопрос. PDFCreator молодец, у него на листах нет непечатаемых полей, т.е. размер бумаги совпадает с печатной областью.

А вот мой реальный принтер такие поля имеет.

 

Косяк вот в чём. Сейчас видовой экран вставляется относительно угла печатной области, и рамка получается смещённой в сторону, примерно так:

_http://gyazo.com/f3351795538b5d3b9777808b4edd133e

 

Я так понял, что это не бага, а фича, и что вроде даже есть спец. метод GetPaperMargins: _http://vbamodel.narod.ru/AutoCAD/idh_getpapermargins.htm

но только чего-то у меня он не работает =(

GetPaperSize тоже.

я что-то не так делаю, или они просто не поддерживаются в нано?

Ссылка на сообщение
Поделиться на другие сайты
  • 7 месяцев спустя...

в нано нет переменной PLOTOFFSET?

_http://exchange.autodesk.com/autocad/rus/online-help/browse#WS1a9193826455f5ffa23ce210c4a30acaf-4ef3.htm

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

Есть задача: отметить рамкой отпечатанную область после вывода на печать части изображения из листа модели. Понимаю, что задача не сложная, но я столкнулся с некоторыми проблемами.

1) Как автоматически при запуске nanocad запускать .Net приложение и команду из него. (При вызове команды срабатывает конструктор в котором я подписываюсь на событие завершения печати)

2) Событие завершения печати EndPlot есть, но оно не срабатывает, поэтому приходится использовать EndCommand и в нем узнавать какая команда завершается. Однако EndCommand (Plot)срабатывает даже, если нажать кнопку «Отмена» в окне печати или вовсе закрыть его, при этом выбранная область печать также отмечается, чего не должно происходить.

Первую проблему пытался решить так. Сборка .Net подгружается автоматически при открытии документа, становится доступна команда PrintMarker, при вызове которой я пытался вызвать команду PLOT, однако оказывается нельзя вызвать команду, если активна другая. Подскажите как возможно решить эти проблемы. Ниже привожу исходный код.

using System.Runtime.InteropServices;
using System.Windows.Forms;
using OdaX;
using Teigha.Runtime;
namespace nanoPrintMarker
{
public class nanoClass
{
private nanoCAD.Document _document;
private nanoCAD.Application _ncApp;
public nanoClass()
	{
	   _ncApp = (nanoCAD.Application) Marshal.GetActiveObject("nanoCAD.Application");
		_ncApp.EndCommand -= _ncApp_EndCommand;
		_ncApp.EndCommand += _ncApp_EndCommand;
	}

private void _ncApp_EndCommand(string CommandName)
	{
		  // заходит!
	  if (CommandName == "Plot")
		{
			MarkPrintArea();//отмечаем область печати
		}
	  if (CommandName == "PrintMarker")
		{
	  //нажимаем ctrl+P :-)
	  SendKeys.Send("PLOT" + "{ENTER}"); // ничего не происходит
	  SendKeys.SendWait("PLOT" + "{ENTER}"); // пишет, что нельзя запустить команду, когда активна другая
		}
	}

private void MarkPrintArea()
	{
		object ur;
		object ll;
		object ul;
		object lr;
		object tchk;
		_ncApp.ActiveDocument.Utility.CreateTypedArray(out tchk, 5, new object[] {0, 0, 0});
		AcadViewport vp = _ncApp.ActiveDocument.ActiveViewport;
		vp.Target = tchk;
		// получаем выбранную область для печати
		_ncApp.ActiveDocument.ActiveLayout.GetWindowToPlot(out ll, out ur);
		ul = newdouble[] {((double[]) ll)[0], ((double[]) ur)[1]};
		lr = newdouble[] {((double[]) ur)[0], ((double[]) ll)[1]};
		// создаемслой
		AcadLayer layer = _ncApp.ActiveDocument.Layers.Add("PrintMarkerLayer");
		_ncApp.ActiveDocument.ActiveLayer = layer;
		layer.Plottable = false;
		layer.color = AcColor.acGreen;
		// диагонали
		_ncApp.ActiveDocument.ModelSpace.AddLine(ul, lr);
		_ncApp.ActiveDocument.ModelSpace.AddLine(ll, ur);
		// прямоугольник
		_ncApp.ActiveDocument.ModelSpace.AddLine(ll, ul);
		_ncApp.ActiveDocument.ModelSpace.AddLine(ul, ur);
		_ncApp.ActiveDocument.ModelSpace.AddLine(ur, lr);
		_ncApp.ActiveDocument.ModelSpace.AddLine(lr, ll);
	}

private void setupPlotConfig()
	{
	   var myPlotConfig = _ncApp.ActiveDocument.ActiveLayout;
	   _document = _ncApp.ActiveDocument;
		myPlotConfig.RefreshPlotDeviceInfo();
		myPlotConfig.ConfigName = "Canon LBP3010/LBP3018/LBP3050";
		myPlotConfig.CanonicalMediaName = "A3";
		myPlotConfig.PlotOrigin = "0,0";
		myPlotConfig.PaperUnits = AcPlotPaperUnits.acMillimeters;
		myPlotConfig.PlotType = AcPlotType.acWindow; // рамка
		myPlotConfig.PlotRotation = AcPlotRotation.ac90degrees;
		myPlotConfig.StandardScale = AcPlotScale.acScaleToFit;
		myPlotConfig.StyleSheet = "monochrome.ctb";
		myPlotConfig.PlotWithPlotStyles = true;
		myPlotConfig.PlotWithLineweights = true;
	}

[CommandMethod("PrintMarker")]
publicvoid PrintMarker()
	{
		setupPlotConfig();
		_document.Utility.Prompt("PrintMarker is runing ...");
		_ncApp.ActiveDocument.SendCommand("PLOT"); //так не работает (ничего не происходит)
	}
}
}

Изменено пользователем Dmitros
Ссылка на сообщение
Поделиться на другие сайты

Для программной печати лучше не вызывать команду PLOT, тем более, что консольный вариант команды, -PLOT, ещё не реализован, а использовать метод COM интерфейса Plot.PlotToDevice().

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!
×
×
  • Создать...