调用打印程序“PublishToWeb JPG.pc3”进行图片打印,该打印驱动程序中内置了很多的打印方案,在同尺寸的打印方案下,数据范围越大打印出来的清晰度就越差,内置的尺寸不一定都满足,在又要通过我们的插件去完成打印任务,又不能让客户总是做配置的情况下,我总结了一个不是很完美的解决方案,实现思路如下:

1、选定基础打印尺寸方案(本demo选定“UserDefinedRaster (1600.00 x 1200.00Pixels)”),一定是系统自带的,不然就需要人工配置,暂时没有找到通过代码去修改打印方案

2、在一定的精度比例尺下(本demo是一个像素点代表10个坐标点的跨度),根据用户选择的范围计算出要打印的图片数量。

3、将单张打印的图片存储到临时文件夹下,等全部打印完毕,按照顺序合并成一张图图片

主方法,打印合成的入口

   public  bool CutImgAndPutFromLeftUpperCAD(Document doc)
{
Point3d maxPt = Point3d.Origin;
Point3d minPt = Point3d.Origin;
PromptIntegerOptions prInt = new PromptIntegerOptions("\n请选择导出方式:选择方式(1:全图导出,2:拉框导出):");
prInt.DefaultValue = ;
prInt.AllowArbitraryInput = false;
prInt.AllowNegative = false;
prInt.AllowNone = false;
PromptIntegerResult ptrInt = Tools.MdiAcEditor.GetInteger(prInt);
if (ptrInt.Status != PromptStatus.OK)
return false;
switch (ptrInt.Value)
{
case :
maxPt = doc.Database.Extmax;
minPt = doc.Database.Extmin;
break;
case :
PromptPointOptions StartPoint = new PromptPointOptions("\n请选择第一个角点");
PromptPointResult StartPointResult = Tools.MdiAcEditor.GetPoint(StartPoint);
PromptCornerOptions PromptCornerOptions = new PromptCornerOptions("\n请选中第二个角点", StartPointResult.Value);
PromptPointResult EndPointResult = Tools.MdiAcEditor.GetCorner(PromptCornerOptions);
double maxX = StartPointResult.Value.X > EndPointResult.Value.X ? StartPointResult.Value.X : EndPointResult.Value.X;
double minX = StartPointResult.Value.X > EndPointResult.Value.X ? EndPointResult.Value.X : StartPointResult.Value.X;
double maxY = StartPointResult.Value.Y > EndPointResult.Value.Y ? StartPointResult.Value.Y : EndPointResult.Value.Y;
double minY = StartPointResult.Value.Y > EndPointResult.Value.Y ? EndPointResult.Value.Y : StartPointResult.Value.Y; maxPt = new Point3d(maxX, maxY, );
minPt = new Point3d(minX, minY, );
break;
} string JPGSavePath = Const.systemPath + "\\Save";
string dataSavePath = Const.systemPath + "\\Temp";
if (Directory.Exists(dataSavePath))
{
FileOperate.DelectDir(dataSavePath);
}
else
{
Directory.CreateDirectory(dataSavePath);
}
if (Directory.Exists(JPGSavePath))
{
FileOperate.DelectDir(JPGSavePath);
}
else
{
Directory.CreateDirectory(JPGSavePath);
}
Point3d LeftUpP = new Point3d(minPt.X, maxPt.Y, );
Point3d RightDownP = new Point3d(maxPt.X, minPt.Y, );
Point3d LeftDownP = new Point3d(minPt.X, minPt.Y, );
Point3d RightUpP = new Point3d(maxPt.X, maxPt.Y, );
//根据坐标范围计算图片的数量,多于100张不执行打印任务
int rows = Convert.ToInt32(Math.Floor(LeftUpP.Y - RightDownP.Y) / 12000.0) + ;
int cels = Convert.ToInt32(Math.Floor(RightUpP.X - LeftUpP.X) / 16000.0) + ;
if (rows *cels > )
{
return false;
}
int cutTrueCount = ;
int itemImgCount = ;
itemImgCount = ;
int imgCount = ;
string imgPathAndName = string.Empty;
CircularProgress cirProgress = new CircularProgress(, rows * cels, "正在导出图片");
cirProgress.StartProgress(); try
{ for (int row = ; row < rows; row++)
{
for (int cel = ; cel < cels; cel++)
{
try
{
imgCount++;
cirProgress.SendMessageChangeValue("正在切图 ", (imgCount*)/ (rows * cels));
double nowLeftX = LeftUpP.X + (double)(cel * );
double nowLeftY = LeftUpP.Y - (double)(row * );
Point3d leftPoint = new Point3d(nowLeftX, nowLeftY - , );
Point3d rightPoint = new Point3d(nowLeftX + , nowLeftY, );
string m_ImgName = string.Concat(new object[]
{
row,
"_",
cel,
".jpg"
});
imgPathAndName = dataSavePath + "\\";
object obj = imgPathAndName;
imgPathAndName = string.Concat(new object[]
{
obj,
row,
"_",
cel,
".jpg"
});
//单张图片打印
ExportMapToFileCAD(leftPoint, rightPoint, imgPathAndName, doc);
itemImgCount++;
cutTrueCount++;
}
catch
{
break;
}
}
}
string JPGName = doc.Window.Text;
JPGName = JPGName.Split(new char[] { '.' })[];
//开始合成图片
CombinImage(rows, cels, , , dataSavePath, JPGSavePath + "\\" + JPGName + ".jpg", cirProgress);
Tools.MdiAcEditor.WriteMessageWithReturn("图片导出成功:" + JPGSavePath + "\\" + JPGName + ".jpg");
cirProgress.StopProgress();
return true; }
catch (Exception ex)
{
cirProgress.StopProgress();
return false;
}
}
  private  bool ExportMapToFileCAD(Point3d leftPoint, Point3d rigthPoint, string fileName, Document doc)
{
bool result;
try
{
Editor ed = doc.Editor;
Database db = doc.Database;
if (fileName.Trim().Equals(""))
{
result = false;
}
else
{
using (doc.LockDocument())
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
//一定要记得设置,否则打印将非常之慢
Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BackGroundPlot", );
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
Layout lo = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForWrite);
PlotInfo pi = new PlotInfo();
pi.Layout = btr.LayoutId;
PlotSettings ps = new PlotSettings(lo.ModelType);
ps.CopyFrom(lo);
PlotSettingsValidator psv = PlotSettingsValidator.Current;
//很重要,坐标处理,针对自定义坐标系的,像天正的图纸,不做处理可能会打印出空白的
Extents2d ext2d = Ucs2Dcs(leftPoint, rigthPoint);
psv.SetPlotWindowArea(ps, ext2d);
psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Window);
psv.SetPlotRotation(ps, );
psv.SetStdScaleType(ps, );
psv.SetPlotCentered(ps, true); psv.GetCanonicalMediaNameList(ps);
psv.SetPlotConfigurationName(ps, "PublishToWeb JPG.pc3", "UserDefinedRaster (1600.00 x 1200.00Pixels)");
pi.OverrideSettings = ps;
PlotInfoValidator piv = new PlotInfoValidator();
piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
piv.Validate(pi);
while ((PlotFactory.ProcessPlotState == ProcessPlotState.BackgroundPlotting) || (PlotFactory.ProcessPlotState == ProcessPlotState.ForegroundPlotting))
{
System.Threading.Thread.Sleep();
}
if (PlotFactory.ProcessPlotState == )
{
PlotEngine pe = PlotFactory.CreatePublishEngine();
using (pe)
{
PlotProgressDialog ppd = new PlotProgressDialog(false, , true);
using (ppd)
{
ppd.set_PlotMsgString(, "CAD切图");
ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "取消切图");
ppd.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "取消切图");
ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "切图");
ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "正在切图");
ppd.LowerPlotProgressRange = ;
ppd.UpperPlotProgressRange = ;
ppd.PlotProgressPos = ;
ppd.OnBeginPlot();
ppd.IsVisible = false;
pe.BeginPlot(ppd, null);
pe.BeginDocument(pi, fileName, null, , true, fileName);
ppd.OnBeginSheet();
ppd.LowerSheetProgressRange = ;
ppd.UpperSheetProgressRange = ;
ppd.SheetProgressPos = ;
PlotPageInfo ppi = new PlotPageInfo();
pe.BeginPage(ppi, pi, true, null);
pe.BeginGenerateGraphics(null);
pe.EndGenerateGraphics(null);
pe.EndPage(null);
ppd.SheetProgressPos = ;
ppd.OnEndSheet();
pe.EndDocument(null);
ppd.PlotProgressPos = ;
ppd.OnEndPlot();
pe.EndPlot(null);
}
}
}
else
{
ed.WriteMessage("\n另外一个程序正在运行中。。。");
}
}
}
result = true;
}
}
catch (System.Exception ex)
{
result = false;
}
return result;
}

根据范围打印单张图片

  private  void CombinImage(int rows, int cels, int width, int height,string url,string outPath , CircularProgress cirProgress)
{
using (Bitmap bg = new Bitmap(cels * width, rows * height))
{
//构建画布
Graphics g = Graphics.FromImage(bg);
//清除画布,背景透明
g.Clear(Color.Transparent);
int leftUpX = ;
int leftUpY = ;
int count = ;
cirProgress.SendMasterChangeMessage("正在进行图片合成", rows * cels);
for (int row = ; row < rows; row++)
{
for (int cel = ; cel < cels; cel++)
{
count++;
cirProgress.SendMessageChangeValue("正在进行图片合成",(count*)/(rows*cels));
//加载小图片
System.Drawing.Image img = System.Drawing.Image.FromFile(url + "\\" + row + "_" + cel + ".jpg");
//确定插入位置
leftUpX = (cel * width);
leftUpY = (row * height);
//插入图片到画布中
g.DrawImage(img, new System.Drawing.Point(leftUpX, leftUpY));
img.Dispose();
}
}
g.Dispose();
bg.Save(outPath);
cirProgress.SendMessageChangeValue("正在进行图片反色", (count * ) / (rows * cels));
// 反色处理并且保存图片
reversePic(bg);
//Bitmap tempBitmap = reversePic(bg);
//tempBitmap.Save(Const.systemPath + "\\Save\\test.jpg");
//tempBitmap.Dispose();
}
}

图片合成

  Extents2d Ucs2Dcs(Point3d objStart, Point3d objEnd)
{
ResultBuffer rbFrom =
new ResultBuffer(new TypedValue(, )),
rbTo =
new ResultBuffer(new TypedValue(, )); double[] firres = new double[] { , , };
double[] secres = new double[] { , , }; CommandTools.acedTrans(
objStart.ToArray(),
rbFrom.UnmanagedObject,
rbTo.UnmanagedObject,
,
firres
); CommandTools.acedTrans(
objEnd.ToArray(),
rbFrom.UnmanagedObject,
rbTo.UnmanagedObject,
,
secres
); Extents2d window =
new Extents2d(
firres[],
firres[],
secres[],
secres[]
);
return window;
}

坐标转换

autocad.net-图片打印合成的更多相关文章

  1. Android 图片的合成

    本文实现在Android下图片的合成 布局设计比较简单: <RelativeLayout xmlns:android="http://schemas.android.com/apk/r ...

  2. iOS开发——多线程篇——NSOperation(基于GCD多线程编程),下载图片并合成新图片

    一.NSOperation的基本概念1.简介NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...

  3. AutoCAD按坐标打印图纸

    前几天公司要求按坐标打印DWG文件,中间走了不少弯路,好在已经搞定了,整理一下分享给大家,希望后来人少走弯路. 1. 设计需求: 公司的图纸用AutoCAD2010做成,通常一个项目的所有图纸都存放在 ...

  4. 【转载自i春秋】图片马合成方法

    1.将图片和一句话木马放在同一个文件夹 2.创建快捷方式,将起始位置修改为图片和txt文本的路径. 3.进行合成,命令如下 copy .png /b + .txt /a .png 4.成功!自行测试. ...

  5. Android图片的合成示例

    package com.example.demo; import android.os.Bundle; import android.app.Activity; import android.grap ...

  6. C# 图片打印杂谈

    日常开头水一下,看了下上次博客,一年零八天了,啧啧,奢侈. 最近这个工作挺满意的,是我想要的发展方向,后续要做机器学习,现在得先把公司之前堆积的问题解决了. 谈人生到此结束,还是说正题吧.(感觉这标题 ...

  7. php 合成图片,合成圆形图片

    合成图片方法 <?php class Share { /* * 生成分享图片 * */ function cre_share_study_img(){ $auth = json_decode(b ...

  8. ThinkPHP5生成二维码图片与另一张背景图片进行合成

    1.PHP方法 public function do_qrcode(){ Vendor('Qrcode.phpqrcode'); Vendor('Qrcode.Compress'); $object ...

  9. 装逼图片旋转合成demo

    测试背景 bg.jpg 测试图片 a.jpg 结果示例 代码demo <?php $bgImgFileName = 'bg.jpg'; $a = 'a.jpg'; // 初始化 $src = i ...

随机推荐

  1. 为什么需要jQuery Mobile

        1.没有所谓的移动互联网,只有一个互联网     2.设计移动网站不需要什么特别处理     3.一个站点应当在所有设备(台式机.手机.电视)上都能运转     jQuery Mobile诞生 ...

  2. POJ 2608

    #include<iostream> #include<stdio.h> #include<string> #include<set> using na ...

  3. Android_EditText 打勾显示输入的密码 --EditText与setTransformationMethod

    实现目标: 实现原理: 为CheckBox添加一个监听器事件; 实现的源码: package edu.cquptzx.showPassword; import android.app.Activity ...

  4. 执行bin/hdfs haadmin -transitionToActive nn1时出现,Automatic failover is enabled for NameNode at bigdata-pro02.kfk.com/192.168.80.152:8020 Refusing to manually manage HA state的解决办法(图文详解)

    不多说,直接上干货! 首先, 那么,你也许,第一感觉,是想到的是 全网最详细的Hadoop HA集群启动后,两个namenode都是standby的解决办法(图文详解) 这里,nn1,不多赘述了.很简 ...

  5. PHP-引入文件(include)后,页面错位,不居中解决办法

    1.把include文件放在head里,不要放在html或doctype上面,这样可以解决居中的问题,空白行的话可以用<div style="display:none"> ...

  6. 【转】谷歌三大核心技术(一)The Google File System中文版

      The Google File System中文版 译者:alex 摘要 我们设计并实现了Google GFS文件系统,一个面向大规模数据密集型应用的.可伸缩的分布式文件系统.GFS虽然运行在廉价 ...

  7. poj1330-----------关于公共祖先的问题

    关于公共祖先的问题分类: 这类问题有多种解法和类型,根据题目给出的信息去判断使用哪一种 1.给你树,只支持从父亲找儿子,不支持儿子找父亲,最后要求最近公共祖先,使用dfs或者分治 2.支持儿子找父亲, ...

  8. Linux Tomcat日志查看实用命令

    实用命令: 查看tomcat运行日志 tail -f catalina.out 通过关键字搜索查看日志 cat jeewx-2015-09-20.log | grep 验证码 查看固定时间日志 cat ...

  9. JS和Java正则表达式验证

    js代码 <script type="text/javascript"> function SubmitCk() { var reg = /^([a-zA-Z0-9]+ ...

  10. es6学习笔记10--箭头函数

    基本用法 ES6允许使用“箭头”(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函 ...