AutoCAD_C#Net大比例尺地形图自动分幅

AutoCAD_C#Net大比例尺地形图自动分幅
现代测绘大比例尺地形图、地籍图都是在电脑上利用绘图软件编辑而成的,
一个项目拚成一张大图,精度高、速度快。但为了日常管理,我们需要把大图分幅。本文将详细介绍地形图分幅的方法、流程和相应的代码,最后附上完整的工程资源文件。
1、地形图的编号
大比例尺地形图、地籍图大多采用矩形分幅法,它是按统一的直角坐标格网划分的。采用矩形分幅时,大比例尺地形图的编号,一般采用图幅西南角坐标公里数编号法。其西南角的坐标X=3530.0km,y=531.0km,所以其编号为“3530.0—531.0”。编号时,比例尺为1:500地形图,坐标值取至0.01km,而1:1000、1:2000地形图取至0.1km。
以1/500为例图幅编号的计算代码:
public static string 图幅号500(this Point2d pt, String 连接符)
{
int i = (int)pt.Y / 250;
string m1 = (i * 0.25).ToString(“F2”);
if (m1.Length < 7) return “00.00-00.00”;
m1 = m1.Substring(m1.Length - 6, 6);
int j = (int)pt.X / 250;
string m2 = (j * 0.25).ToString(“F2”);
m2 = m2.Substring(m2.Length - 6, 6);
return m1 + 连接符 + m2;
}
2、地形图西南角坐标
图上坐标X=3530635.687m,y=531256.218m,则对应的图幅编号:“3530.50-531.25”。
图幅编号计算西南角坐标的代码:
public static Point3d 图幅号toPoint(this string 图幅号)
{
string[] strArray = 图幅号.Split(’-’);
double X= Convert.ToDouble (strArray[0])* 1000;
double Y = Convert.ToDouble(strArray[1])* 1000;
return new Point3d(X, Y,0);
}
3、按范围线绘接合图
首选,需要画一个项目范围线,利用范围线的最大点、最小点坐标计算范围内所包含的图幅,绘画图幅接合图。
绘画图幅接合图的代码:

public void 按范围线展绘接合图()
{
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
db.新建图层(“图幅范围”, 7);
db.新建图层(“图幅图号”, 7);
PromptIntegerOptions optInt = new PromptIntegerOptions(“请输入测图比例尺分母(默认 1000):”);
optInt.DefaultValue = 1000;
PromptIntegerResult resint = ed.GetInteger(optInt);
int 比例尺分母 = resint.Value;
比例尺分母 = (比例尺分母 == 0) ? 1000 : 比例尺分母;
int 图廓长度 = 比例尺分母 / 2;
double 字高 = (20.0 * 图廓长度) / 500.0;
ObjectId id = ed.GetEntity("\n选择测区范围线!").ObjectId;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
Polyline pLine = trans.GetObject(id, OpenMode.ForRead) as Polyline;
Extents3d extents3 = pLine.GeometricExtents;
Point2d 最小点 = new Point2d(extents3.MinPoint.X, extents3.MinPoint.Y);
Point2d 最大点 = new Point2d(extents3.MaxPoint.X, extents3.MaxPoint.Y);
int XX = (int)(最小点.X / 图廓长度) * 图廓长度;
int YY = (int)(最小点.Y / 图廓长度) * 图廓长度;
for (int 宽 = XX; 宽 < 最大点.X; 宽 = 宽 + 图廓长度)
{
for (int 长 = YY; 长 < 最大点.Y; 长 = 长 + 图廓长度)
{
Point2dCollection pts = new Point2dCollection();
Point2d pt1 = new Point2d(宽, 长);
pts.Add(pt1);
Point2d pt2 = new Point2d(宽, 长 + 图廓长度);
pts.Add(pt2);
Point2d pt3 = new Point2d(宽 + 图廓长度, 长 + 图廓长度);
pts.Add(pt3);
Point2d pt4 = new Point2d(宽 + 图廓长度, 长);
pts.Add(pt4);
Polyline pline = pts.创建多段线(“图幅范围”, 7, true);
Point3d pt = new Point3d(宽 + 图廓长度 / 2,
长 + 图廓长度 / 2 - 10, 0);
string 图幅号 = “”;
switch (比例尺分母)
{
case 500:
图幅号 = pt1.图幅号500("-");
break;
case 1000:
图幅号 = pt1.图幅号1000("-");
break;
case 2000:
图幅号 = pt1.图幅号2000( “-”, 2, 2);
break;
}
db.对齐文字(图幅号, pt, TextHorizontalMode.TextCenter,
TextVerticalMode.TextVerticalMid, 字高,
1, “图幅图号”, ObjectId.Null, 7);
string appName = “TDQSXX”;
ResultBuffer datas = new ResultBuffer();
datas.Add(new TypedValue(1001, appName));
datas.Add(new TypedValue(1000, 图幅号 + “.dwg”));
datas.Add(new TypedValue(1000, 比例尺分母.ToString()));
datas.Add(new TypedValue(1000, 图廓长度.ToString()));
datas.Add(new TypedValue(1000, 宽.ToString()));
datas.Add(new TypedValue(1000, 长.ToString()));
pline.UpgradeOpen(); //将对象的只读状态升级为可写状态
//将新建的扩展数据附加到实体中
pline.创建扩展数据(appName, datas);
}
}
trans.Commit();
}
BasisClass.ZoomExtens();
}
4、利用接合图幅图写块
幅写快前,先检本一下是否有空图幅,如果有则删除空图幅。
**如果测图范围不是标准矩形,会有空图幅。
图幅写快的代码:
public static void 利用接合图幅图写块()
{
Document pDoc = Application.DocumentManager.MdiActiveDocument;
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
string 文件名 = System.IO.Path.GetFileNameWithoutExtension(pDoc.Name);
string 工作目录 = @“D:\分幅图”;
object tiled = Application.GetSystemVariable(“DWGTITLED”);
if (Convert.ToInt32(tiled) != 0) //如果图形已经被命名
{
工作目录 = System.IO.Path.GetDirectoryName(pDoc.Name) + @"\分幅图";
}
if (System.IO.Directory.Exists(工作目录) == false)
{
System.IO.Directory.CreateDirectory(工作目录);
}
BasisClass.ZoomExtens(); //全屏显示
db.新建图层(“范围”, 4);
TypedValue[] DKvalues = new TypedValue[]
new TypedValue(8, “图幅范围”),
new TypedValue(0, “LWPOLYLINE”), };
SelectionFilter filter = new SelectionFilter(DKvalues);
PromptSelectionResult 图幅范围 = ed.SelectAll(filter);
if (图幅范围.Status != PromptStatus.OK)
{
Application.ShowAlertDialog(“没有<图幅范围>这个图层!程序要退出了!”);
return;
} //选择集创建失败,返回
foreach (var id in 图幅范围.Value.GetObjectIds())
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
Polyline pLine = trans.GetObject(id, OpenMode.ForRead) as Polyline;
if (pLine == null) continue; //跳过一次循环迭代
List ListData = pLine.GetXData();
if (ListData.Count < 6) continue; //跳过一次循环迭代
Point3dCollection pts = pLine.多段线坐标();
string FileName = 工作目录 + ListData[1];
TypedValue[] TFvalues = new TypedValue[]
{ new TypedValue(67, 0), };
filter = new SelectionFilter(TFvalues);
PromptSelectionResult 写块集 =
ed.SelectCrossingPolygon(pts,filter);
ObjectIdCollection ids = new ObjectIdCollection(写块集.Value.GetObjectIds()); //获取所选实体的ID集合
//新建一个数据库对象
Database 新建数据库 = new Database(false, true);
//ID集合成员(实体)复制到新建数据库中,插入点为当前数据库的基点
新建数据库 = db.Wblock(ids, db.Ucsorg);
//以2007格式保存数据库为dwg文件
新建数据库.SaveAs(@FileName, DwgVersion.AC1021);
trans.Commit();
}
}
Application.ShowAlertDialog(“恭喜你,完成啦!”);
}
5、分幅图图预编辑
预编辑包括插入图框、图外整饰、填绘接合表、利用图框进行修剪等工作。
分幅图图预编辑的代码:
public static void 单幅图预编辑()
{
Document pDoc = Application.DocumentManager.MdiActiveDocument;
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
string 标注编号 = System.IO.Path.GetFileNameWithoutExtension(pDoc.Name);
string 文件名 = 标注编号 + “.dwg”; //不含路径
string 父目录 = System.IO.Path.GetDirectoryName(pDoc.Name) + @"";
BasisClass.ZoomExtens();
db.开关全部图层(false, false);
TypedValue[] DKvalues = new TypedValue[] { new TypedValue(8, “图幅范围”), new TypedValue(0, “LWPOLYLINE”), };
SelectionFilter filter = new SelectionFilter(DKvalues);
PromptSelectionResult 图幅范围 = ed.SelectAll(filter);
if (图幅范围.Status != PromptStatus.OK) return; //选择集创建失败,返回
//{ Application.ShowAlertDialog(“没有<图幅范围>这个图层!程序要退出了!”);}
int 比例尺分母 = 1000;
ObjectId fyId = new ObjectId();
Point3dCollection pts = new Point3dCollection();
Polyline dkpLine = new Polyline();
foreach (var id in 图幅范围.Value.GetObjectIds())
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
Polyline pLine = trans.GetObject(id, OpenMode.ForWrite) as Polyline;
if (pLine == null) continue; //跳过一次循环迭代
List ListData = pLine.GetXData();
if (ListData[1] == 文件名)
{
比例尺分母 = Convert.ToInt32(ListData[2]);
fyId = id;
pts = pLine.多段线坐标();
}
else { pLine.Erase(true); }
trans.Commit();
}
}
fyId.剪切();
//获取图框文件名及四角坐标注记字符
string FileName = BasisClass.Net目录();
double k = 比例尺分母 / 1000.0;
Point3d 插入点 = pts[0];
string Xxm = “”, Xym = “”, Dxm = “”, Dym = “”, 格式 = “F2”;
int 取位 = 5;
switch (比例尺分母)
{
case 500:
FileName = FileName + @“CASS_BLOCKS/500标准图框.DWG”;
break;
case 1000:
FileName = FileName + @“CASS_BLOCKS/1000标准图框.DWG”;
break;
case 2000:
FileName = FileName + @“CASS_BLOCKS/2000标准图框.DWG”;
取位 = 4; 格式 = “F1”;
break;
}
Xxm = (pts[0].X / 1000).ToString(格式);
Xxm = Xxm.Substring(Xxm.Length - 取位);
Xym = (pts[0].Y / 1000).ToString(格式);
Xym = Xym.Substring(Xym.Length - 取位);
Dxm = (pts[2].X / 1000).ToString(格式);
Dxm = Dxm.Substring(Dxm.Length - 取位);
Dym = (pts[2].Y / 1000).ToString(格式);
Dym = Dym.Substring(Dym.Length - 取位);
//插入图框
string 块名 = System.IO.Path.GetFileNameWithoutExtension(FileName);
string 图层名 = “0”;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;//只读方式打开当前块表,获取块表记录
BlockTableRecord bty = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;//读写方式打开模型空间记录表,添加数据
ObjectId entID;
ObjectId xrefId = db.AttachXref(FileName, 块名); //以附着的方式插入
BlockReference bref = new BlockReference(插入点, xrefId); // 通过块定义添加块参照
bref.ScaleFactors = new Scale3d(k, k, k);
bref.Rotation = 0;
entID = bty.AppendEntity(bref); //将图形对象的信息添加到块表记录中
trans.AddNewlyCreatedDBObject(bref, true); //把对象添加到事务处理中
DBObjectCollection entitySet = new DBObjectCollection();
bref.Explode(entitySet);
bref.Erase(true);
bref.Dispose();
//替换四角图廓坐标注记
foreach (Entity entity in entitySet)
{
entID = bty.AppendEntity(entity);
trans.AddNewlyCreatedDBObject(entity, true);
if (entity.GetType().Name == “DBText”)
{
DBText tobj = (DBText)entity;
switch (tobj.TextString)//图框模板上的注记,替换为本幅图的数
{
case “99.99-99.99”:
tobj.TextString = 标注编号;
图层名 = tobj.Layer;
break;
case “22.25”:
tobj.TextString = Xxm;
break;
case “32.25”:
tobj.TextString = Dxm;
break;
case “22.55”:
tobj.TextString = Xym;
break;
case “32.55”:
tobj.TextString = Dym;
break;
//case “地籍图样图”:
// tobj.TextString = “如何查找图名”;
// break;
}
}
}
entitySet.Clear();
trans.Commit();
}
//标注接合表
ObjectId styleId = db.文字式样ID(“DRDOC”); //获取文本样式的ID
for (int i = 1; i < 9; i++)
{
double x1 = BasisClass.Choose(i, 7.5, 22.5, 37.5, 37.5, 7.5, 7.5, 22.5, 37.5);
double y1 = BasisClass.Choose(i, 535.5, 535.5, 535.5, 527.5, 527.5, 519.5, 519.5, 519.5);
double x2 = BasisClass.Choose(i, -500, 0, 500, 500, -500, -500, 0, 500);
double y2 = BasisClass.Choose(i, 500, 500, 500, 0, 0, -500, -500, -500);
//接合表注记位置
Point3d pt1 = new Point3d(插入点.X + x1 * k, 插入点.Y + y1 * k, 0);
//相应图幅的西北角,图号计算的基点
Point3d pt2 = new Point3d(插入点.X + x2 * k, 插入点.Y + y2 * k, 0);
string 图幅号 = “”;
switch (比例尺分母)
{
case 500:
图幅号 = pt2.图幅号500("-");
break;
case 1000:
图幅号 = pt2.图幅号1000("-");
break;
case 2000:
图幅号 = pt2.图幅号2000("-", 2, 2);
break;
}
FileName = 图幅号 + “.dwg”;
FileName = 父目录 + FileName;
if (!File.Exists(FileName)) continue; //空图幅 跳过一次循环迭代
db.对齐文字(图幅号, pt1, TextHorizontalMode.TextCenter, TextVerticalMode.TextVerticalMid, 2 * k, 0.6, 图层名, styleId, 42);
}
}
6、人工编辑完然
经程序预编辑,还需要进行人工编辑,主要是图廓周边的注记位置等程序难以解决的问题。
**工程资源文件的版本是AutoCAD.Net2016 _64位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值