using GrxCAD.ApplicationServices;
using GrxCAD.DatabaseServices;
using GrxCAD.EditorInput;
using GrxCAD.Geometry;
using GrxCAD.Runtime;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Thumbnail
{
public class tkinfo
{
public Point3dCollection ptcoll; //图幅框节点
public string tfh; //节点
public ObjectId id; //图幅框id
public ObjectId tfhid; //图幅号id
}
public class getThumbnail
{
public static double bl;
public static string tc_tk;
public static string tc_tfh;
//public static int jtk;
///
/// 替换接图框
///
public void openDwg(String fileName, String insertpath, String savepath)
{
DirectoryInfo root = new DirectoryInfo(fileName);
List filename = new List(); //文件名
FileInfo[] files = root.GetFiles();
foreach (FileInfo file in files)
{
if (!file.Name.Contains(".dwg"))
continue;
else
filename.Add(file.Name);
}
for (int filenum = 0; filenum < filename.Count; filenum++)
{
string fileName2 = fileName + "\\" + filename[filenum];
Document doc = GrxCAD.ApplicationServices.Application.DocumentManager.Add(fileName2);
Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
List tf = new List(); //与本图幅相交的图幅
List tkinfolist = new List(); //存放图框坐标和图幅号
//using (DocumentLock docLock = doc.LockDocument())
//{
Point3dCollection ptcoll = new Point3dCollection();
TypedValue[] value = new TypedValue[]
{
new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE"),
new TypedValue((int)DxfCode.LayerName,"9800")
};
SelectionFilter filter = new SelectionFilter(value);
PromptSelectionResult psr = ed.SelectAll(filter);
//获取9800图层中最长的四条线,它们的交点即为内图框角点
if (psr.Status == PromptStatus.OK)
{
ObjectIdCollection pllcoll = new ObjectIdCollection();
SelectionSet ss = psr.Value;
ObjectIdCollection idcoll1 = new ObjectIdCollection(ss.GetObjectIds());
for (int i = 0; i < idcoll1.Count; i++)
{
using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
{
Entity ent = trans.GetObject(idcoll1[i], OpenMode.ForRead) as Entity;
if (ent is Polyline)
{
Polyline pll = (Polyline)ent;
if (pll.Length == 250 * bl + 5.75 * bl * 2 & pll.Closed == false)
pllcoll.Add(idcoll1[i]);
}
if (ent is Polyline2d)
{
Polyline2d pll = (Polyline2d)ent;
if (pll.Length == 250 * bl + 5.75 * bl * 2 & pll.Closed == false)
pllcoll.Add(idcoll1[i]);
}
trans.Commit();
}
}
getIntersectpts(pllcoll, doc, ptcoll);
}
sortpts(ptcoll);
deletetc(doc, ptcoll);
copytoCurrent(doc, insertpath, true);
getTKinfo(doc, tkinfolist);//获取图框信息
getIntersecttk(tkinfolist, ptcoll, tf);
move(doc, tkinfolist, tf, ptcoll);
deletetk(doc, tkinfolist, tf);
ObjectId HZ= createTextStyle(doc);
draw(doc, ptcoll, tf, HZ);
if (tf.Count == 0 || tf == null)
{
for (int i = 0; i < tkinfolist.Count; i++)
{
using (Transaction tran = doc.Database.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tran.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tran.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
Point3dCollection pts = new Point3dCollection();
Entity ent1 = tran.GetObject(tkinfolist[i].id, OpenMode.ForWrite) as Entity;
Entity ent2 = tran.GetObject(tkinfolist[i].tfhid, OpenMode.ForWrite) as Entity;
ent1.Erase();
ent2.Erase();
if (i == tkinfolist.Count - 1)
{
LayerTable layerTable = tran.GetObject(doc.Database.LayerTableId, OpenMode.ForWrite) as LayerTable;
LayerTableRecord layer = tran.GetObject(layerTable[tc_tfh], OpenMode.ForWrite) as LayerTableRecord;
layer.Erase(true);
if (tc_tfh != tc_tk)
{
layer = tran.GetObject(layerTable[tc_tk], OpenMode.ForWrite) as LayerTableRecord;
layer.Erase(true); // 删除图层
}
}
tran.Commit();
}
}
}
//}
dynamic acadApp = GrxCAD.ApplicationServices.Application.AcadApplication;
acadApp.ZoomExtents();
doc.Database.SaveAs(savepath + "\\" + filename[filenum], true, DwgVersion.AC1024, doc.Database.SecurityParameters);
doc.CloseAndDiscard();
}
MessageBox.Show("替换完成");
}
///
/// 获取图框信息
///
private void getTKinfo(Document doc, List tkinfolist)
{
//获取图框和图幅号
Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
TypedValue[] value = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,tc_tk),
new TypedValue((int)DxfCode.Start,"LWPOLYLINE")
};
SelectionFilter filter = new SelectionFilter(value);
PromptSelectionResult psr = ed.SelectAll(filter);
TypedValue[] value_text = new TypedValue[]
{
new TypedValue((int)DxfCode.Start,"Text"),
new TypedValue((int)DxfCode.LayerName,tc_tfh)
};
SelectionFilter filter_text = new SelectionFilter(value_text);
PromptSelectionResult psr_text = ed.SelectAll(filter_text);
if (psr.Status == PromptStatus.OK && psr_text.Status == PromptStatus.OK)
{
SelectionSet ss = psr.Value;
ObjectIdCollection idcoll = new ObjectIdCollection(ss.GetObjectIds());
SelectionSet ss_text = psr_text.Value;
ObjectIdCollection idcoll_text = new ObjectIdCollection(ss_text.GetObjectIds());
for (int i = 0; i < idcoll.Count; i++)
{
int j = 0;
int flag = 0;
while (idcoll_text.Count != 0)
{
using (Transaction tran = doc.Database.TransactionManager.StartTransaction())
{
Point3dCollection ptcoll = new Point3dCollection();
Entity ent = tran.GetObject(idcoll[i], OpenMode.ForRead) as Entity;
if (ent is Polyline)
{
Polyline pll = tran.GetObject(idcoll[i], OpenMode.ForRead) as Polyline;
pll.GetStretchPoints(ptcoll);
}
if (ent is Polyline2d)
{
Polyline2d pll = tran.GetObject(idcoll[i], OpenMode.ForRead) as Polyline2d;
pll.GetStretchPoints(ptcoll);
}
DBText text = tran.GetObject(idcoll_text[j], OpenMode.ForRead) as DBText;
//获取框线角点并将其按特定顺序排列
List X = new List();
List Y = new List();
for (int ii = 0; ii < 4; ii++)
{
if (!X.Contains(ptcoll[ii].X))
X.Add(ptcoll[ii].X);
if (!Y.Contains(ptcoll[ii].Y))
Y.Add(ptcoll[ii].Y);
}
if (X[1] < X[0])
{
Double temp = X[0];
X[0] = X[1];
X[1] = temp;
}
if (Y[1] < Y[0])
{
Double temp = Y[0];
Y[0] = Y[1];
Y[1] = temp;
}
tkinfo pt = new tkinfo();
pt.ptcoll = ptcoll;
pt.id = idcoll[i];
pt.tfhid = idcoll_text[j];
//获取图幅号坐标
double x = text.Position.X;
double y = text.Position.Y;
//判断图框对应图幅号
if (x > X[0] && y > Y[0] && x < X[1] && y > Y[0] &&
x < X[1] && y < Y[1] && x > X[0] && y < Y[1])
{
String tfh = text.TextString;
pt.tfh = tfh;
idcoll_text.RemoveAt(j);
tkinfolist.Add(pt);
flag = 1;
}
tran.Commit();
if (flag == 1)
break;
}
j = j + 1;
}
}
}
}
///
/// 将分幅图加入当前视图
///
private void copytoCurrent(Document doc, String insertpath, bool explode)
{
ObjectIdCollection idsToClone = new ObjectIdCollection();
ObjectId btrId;
//using (DocumentLock docTargetLock = doc.LockDocument())
//{
using (Transaction trTarget = doc.TransactionManager.StartTransaction())
{
LayerTable layerTable = trTarget.GetObject(doc.Database.LayerTableId, OpenMode.ForRead) as LayerTable;
ObjectId layerId = layerTable["0"];
doc.Database.Clayer = layerId;
var targetBlockTable = trTarget.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;
var targetModelSpace = trTarget.GetObject(targetBlockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
btrId = targetModelSpace.ObjectId;
trTarget.Commit();
}
using (var sourceDb = new Database(false, true))
{
sourceDb.ReadDwgFile(insertpath, FileOpenMode.OpenForReadAndAllShare, false, null);
using (Transaction trSource = sourceDb.TransactionManager.StartTransaction())
{
var modelSpaceSource = trSource.GetObject(
SymbolUtilityServices.GetBlockModelSpaceId(sourceDb),
OpenMode.ForRead) as BlockTableRecord;
foreach (ObjectId objId in modelSpaceSource)
{
var entity = trSource.GetObject(objId, OpenMode.ForRead) as Entity;
if (entity != null && (entity.Layer == tc_tk || entity.Layer == tc_tfh))
idsToClone.Add(objId);
}
using (var mapping = new IdMapping())
sourceDb.WblockCloneObjects(idsToClone, btrId, mapping, DuplicateRecordCloning.Replace, false);
trSource.Commit();
}
}
//}
}
///
/// 获取内图框四个角点
///
private void getIntersectpts(ObjectIdCollection pllcoll, Document doc, Point3dCollection ptcoll)
{
using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
{
for (int k = 0; k < pllcoll.Count - 1; k++)
{
Point3dCollection intersectpt = new Point3dCollection();
for (int kk = k + 1; kk < pllcoll.Count; kk++)
{
Entity ent1 = trans.GetObject(pllcoll[k], OpenMode.ForRead) as Entity;
Entity ent2 = trans.GetObject(pllcoll[kk], OpenMode.ForRead) as Entity;
if (ent1 is Polyline && ent2 is Polyline)
{
Polyline pll1 = (Polyline)ent1;
Polyline pll2 = (Polyline)ent2;
pll1.IntersectWith(pll2, Intersect.OnBothOperands, intersectpt, IntPtr.Zero, IntPtr.Zero);
//foreach (Point3d pt in intersectpt)
//{
// if (pt == pll1.StartPoint || pt == pll1.EndPoint ||pt = pll2.StartPoint || pt == pll2.EndPoint)
// intersectpt.Remove(pt);
//}
}
if (ent1 is Polyline2d && ent2 is Polyline2d)
{
Polyline2d pll1 = (Polyline2d)ent1;
Polyline2d pll2 = (Polyline2d)ent2;
pll1.IntersectWith(pll2, Intersect.OnBothOperands, intersectpt, IntPtr.Zero, IntPtr.Zero);
}
if (intersectpt.Count != 0)
{
for (int kkk = 0; kkk < intersectpt.Count; kkk++)
{
if (ptcoll.Contains(intersectpt[kkk]))
continue;
else
ptcoll.Add(intersectpt[kkk]);
}
}
}
}
trans.Commit();
}
}
///
/// 获取与当前图幅相交的图框
///
private void getIntersecttk(List tkinfolist, Point3dCollection ptcoll, List tf)
{
//ObjectIdCollection ids= new ObjectIdCollection();
for (int j = 0; j < tkinfolist.Count; j++)
{
//找出tkinfolist中的此图幅
if (tkinfolist[j].ptcoll.Contains(ptcoll[0]) && tkinfolist[j].ptcoll.Contains(ptcoll[1]) &&
tkinfolist[j].ptcoll.Contains(ptcoll[2]) && tkinfolist[j].ptcoll.Contains(ptcoll[3]))
{
sortpts(tkinfolist[j].ptcoll);
double plusnum = Math.Abs(tkinfolist[j].ptcoll[0].X - tkinfolist[j].ptcoll[2].X);
//创建扩大一倍的窗口搜索相交图幅
Point3d pt1 = new Point3d(tkinfolist[j].ptcoll[0].X - plusnum, tkinfolist[j].ptcoll[0].Y - plusnum, 0);
Point3d pt2 = new Point3d(tkinfolist[j].ptcoll[2].X + plusnum, tkinfolist[j].ptcoll[2].Y + plusnum, 0);
Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
TypedValue[] value = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,tc_tk)
};
SelectionFilter filter = new SelectionFilter(value);
dynamic acadApp = GrxCAD.ApplicationServices.Application.AcadApplication;
acadApp.ZoomExtents();
//使用找出的图幅号内框线交点进行相交选择以选出与此图幅相交的其他图幅
//PromptSelectionResult psr = ed.SelectCrossingPolygon(tkinfolist[j].ptcoll, filter);
//ViewTableRecord view = ed.GetCurrentView();
//view.Width = Math.Abs(3* (ptcoll[0].X - ptcoll[1].X));
//view.Height = Math.Abs(3 * (ptcoll[0].Y - ptcoll[2].Y));
//view.CenterPoint = new Point2d(
// ptcoll[0].X + Math.Abs((ptcoll[0].X - ptcoll[1].X)) / 2,
// ptcoll[0].Y + Math.Abs((ptcoll[0].Y - ptcoll[2].Y)) / 2
//);
//ed.SetCurrentView(view);
PromptSelectionResult psr = ed.SelectCrossingWindow(pt1, pt2, filter);
acadApp.ZoomPrevious();
if (psr.Status == PromptStatus.OK)
{
SelectionSet ss = psr.Value;
ObjectIdCollection idcoll = new ObjectIdCollection(ss.GetObjectIds());
for (int i = 0; i < idcoll.Count; i++)
{
if (idcoll[i] != tkinfolist[j].id)
{
//ids.Add(idcoll[i]);
for (int ii = 0; ii < tkinfolist.Count; ii++)
{
if (idcoll[i] == tkinfolist[ii].id)
{
//获取相交图幅的相应信息
foreach (Point3d temppt in tkinfolist[ii].ptcoll)
{
//筛选窗口内图幅
if (temppt.X > pt1.X && temppt.X < pt2.X &&
temppt.Y > pt1.Y && temppt.Y < pt2.Y)
{
tkinfo pt = new tkinfo();
pt.id = tkinfolist[ii].id;
pt.ptcoll = tkinfolist[ii].ptcoll;
pt.tfh = tkinfolist[ii].tfh;
pt.tfhid = tkinfolist[ii].tfhid;
tf.Add(pt);
break;
}
}
}
}
}
}
}
break;
}
}
}
///
/// 将图框移动到接图框位置
///
private void move(Document doc, List tkinfolist, List tf, Point3dCollection ptcoll)
{
Point3d Frompt = new Point3d(ptcoll[0].X - (261.5 * bl - 5.75 * bl * 2), ptcoll[0].Y - (261.5 * bl - 5.75 * bl * 2), 0);//基点
Point3d Topt = new Point3d(ptcoll[3].X, ptcoll[3].Y + 5.75 * bl + 1.75 * bl, 0);//目标点
for (int i = 0; i < tf.Count; i++)
{
for (int j = 0; j < tkinfolist.Count; j++)
{
if (tf[i].id == tkinfolist[j].id)
{
using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
{
Entity ent = trans.GetObject(tkinfolist[j].id, OpenMode.ForWrite) as Entity;
DBText text = trans.GetObject(tkinfolist[j].tfhid, OpenMode.ForWrite) as DBText;
String txt = text.TextString;
//使输出图幅号为三位数
if (txt[0].ToString() == "0")
{
if (txt[1].ToString() == "0")
{
text.TextString = txt[2].ToString();
}
else
{
text.TextString = txt[1].ToString() + txt[2].ToString();
}
}
Double scalenum = (22.5 * bl / 3) / (261.5 * bl - 5.75 * bl * 2);//缩放比
Vector3d acVec3d = Frompt.GetVectorTo(Topt);
Matrix3d mt = Matrix3d.Scaling(scalenum, Topt);
if (ent is Polyline)
{
Polyline pll = (Polyline)ent;
pll.TransformBy(Matrix3d.Displacement(acVec3d));
pll.TransformBy(mt);
}
if (ent is Polyline2d)
{
Polyline2d pll = (Polyline2d)ent;
pll.TransformBy(Matrix3d.Displacement(acVec3d));
pll.TransformBy(mt);
}
text.TransformBy(Matrix3d.Displacement(acVec3d));
text.TransformBy(mt);
Matrix3d mt1 = Matrix3d.Scaling(3, new Point3d(text.AlignmentPoint.X, text.AlignmentPoint.Y, 0));
text.TransformBy(mt1);
trans.Commit();
}
}
}
}
}
///
/// 删除9800图层
///
private void deletetc(Document doc, Point3dCollection ptcoll)
{
Editor ed = doc.Editor;
TypedValue[] value_tfk = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,"9800")
};
SelectionFilter filter_tfk = new SelectionFilter(value_tfk);
Point3d pt1 = new Point3d(ptcoll[3].X, ptcoll[3].Y + 5.75 * bl + 1.75 * bl, 0);
Point3d pt2 = new Point3d(ptcoll[3].X + 22.5 * bl, ptcoll[3].Y + (5.5 + 0.5 + 1.5) * bl + 12 * bl + 10, 0);
//dynamic acadApp = GrxCAD.ApplicationServices.Application.AcadApplication;
//acadApp.ZoomExtents();
//using (DocumentLock docTargetLock = doc.LockDocument())
//{
using (Transaction tr = doc.Database.TransactionManager.StartTransaction())
{
ViewTableRecord view = ed.GetCurrentView();
view.Width = 22.5 * bl + 1;
view.Height = 12 * bl + 1;
view.CenterPoint = new Point2d(
pt1.X + Math.Abs((pt1.X - pt2.X)) / 2,
pt1.Y + Math.Abs((pt2.Y - 10 - pt1.Y)) / 2
);
ed.SetCurrentView(view);
tr.Commit();
}
//}
PromptSelectionResult psr_tfk = ed.SelectCrossingWindow(pt1, pt2, filter_tfk);
//acadApp.ZoomPrevious();
if (psr_tfk.Status == PromptStatus.OK)
{
SelectionSet ss = psr_tfk.Value;
ObjectIdCollection idcoll = new ObjectIdCollection(ss.GetObjectIds());
for (int i = 0; i < idcoll.Count; i++)
{
//using (DocumentLock docTargetLock = doc.LockDocument())
//{
using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
{
Entity ent = trans.GetObject(idcoll[i], OpenMode.ForWrite) as Entity;
ent.Erase();
trans.Commit();
}
}
}
//}
}
///
/// 删除除了相交图框以外的图框和相应图幅号
///
private void deletetk(Document doc, List tkinfolist, List tf)
{
ObjectIdCollection deleteid = new ObjectIdCollection();
ObjectIdCollection deletetfhid = new ObjectIdCollection();
ObjectIdCollection tfid = new ObjectIdCollection();
for (int i = 0; i < tf.Count; i++)
{
tfid.Add(tf[i].id);
}
for (int i = 0; i < tf.Count; i++)
{
for (int j = 0; j < tkinfolist.Count; j++)
{
if (tf[i].id != tkinfolist[j].id)
{
if (!deleteid.Contains(tkinfolist[j].id) && !tfid.Contains(tkinfolist[j].id))
{
deleteid.Add(tkinfolist[j].id);
deletetfhid.Add(tkinfolist[j].tfhid);
}
}
}
}
for (int k = 0; k < deleteid.Count; k++)
{
using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
{
Entity ent = trans.GetObject(deleteid[k], OpenMode.ForWrite) as Entity;
DBText text = trans.GetObject(deletetfhid[k], OpenMode.ForWrite) as DBText;
ent.Erase();
text.Erase();
trans.Commit();
}
}
}
///
/// 点排序
///
private void sortpts(Point3dCollection ptcoll)
{
List x = new List();
List y = new List();
for (int i = 0; i < 4; i++)
{
if (!x.Contains(ptcoll[i].X))
x.Add(ptcoll[i].X);
if (!y.Contains(ptcoll[i].Y))
y.Add(ptcoll[i].Y);
}
if (x[0] > x[1])
{
double temp = x[0];
x[0] = x[1];
x[1] = temp;
}
if (y[0] > y[1])
{
double temp = y[0];
y[0] = y[1];
y[1] = temp;
}
ptcoll[0] = new Point3d(x[0], y[0], 0); //左下
ptcoll[1] = new Point3d(x[1], y[0], 0); //右下
ptcoll[2] = new Point3d(x[1], y[1], 0); //右上
ptcoll[3] = new Point3d(x[0], y[1], 0); //左上
}
///
/// 绘制接图表
///
private void draw(Document doc, Point3dCollection ptcoll, List tf,ObjectId HZ)
{
Point2d p1 = new Point2d();
Point2d p2 = new Point2d();
double x = ptcoll[3].X;
double y = ptcoll[3].Y;
double dist_l = 22.5 * bl / 3; //长
double dist_w = 12 * bl / 3; //宽
double dist_nw = 5.75 * bl; //内外框距离
double dist_w2jt = 1.75 * bl; //外框到接图表距离
double dist_tc = Math.Sqrt((0.5 * bl) * (0.5 * bl) * 2);
double dist_tc1 = 0.404 * bl;
List zj_x = new List();//只有x方向中间错位的图框
List zj_y = new List();//只有y方向中间错位的图框
//double cw_x = -9999;//错位图框左下角x坐标
//double cw_y = -9999;//错位图框左下角y坐标
Point3dCollection cw_x = new Point3dCollection();//x方向错位图框左下角点
Point3dCollection cw_y = new Point3dCollection();//y方向错位图框左下角点
using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trans.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
//长
Polyline pll1 = new Polyline();
p1 = new Point2d(x, y + dist_nw + dist_w2jt);
p2 = new Point2d(x + dist_l * 3, y + dist_nw + dist_w2jt);
pll1.AddVertexAt(0, p1, 0, 0, 0);
pll1.AddVertexAt(1, p2, 0, 0, 0);
pll1.Layer = "9800";
pll1.Linetype = "Bylayer";
pll1.SetDatabaseDefaults();
btr.AppendEntity(pll1);
trans.AddNewlyCreatedDBObject(pll1, true);
for (int i = 1; i < 4; i++)
{
Point3d targetPt = new Point3d(x, y + dist_nw + dist_w2jt + dist_w * i, 0);
Point3d FromPt = new Point3d(x, y + dist_nw + dist_w2jt, 0);
Vector3d acVec3d = FromPt.GetVectorTo(targetPt);
Matrix3d mt = Matrix3d.Displacement(acVec3d);
Entity entCopy = pll1.GetTransformedCopy(mt);
btr.AppendEntity(entCopy);
trans.AddNewlyCreatedDBObject(entCopy, true);
}
//宽
Polyline pll2 = new Polyline();
p1 = new Point2d(x, y + dist_nw + dist_w2jt);
p2 = new Point2d(x, y + dist_nw + dist_w2jt + dist_w * 3);
pll2.AddVertexAt(0, p1, 0, 0, 0);
pll2.AddVertexAt(1, p2, 0, 0, 0);
pll2.Layer = "9800";
pll2.Linetype = "Bylayer";
pll2.SetDatabaseDefaults();
btr.AppendEntity(pll2);
trans.AddNewlyCreatedDBObject(pll2, true);
for (int i = 1; i < 4; i++)
{
Point3d targetPt = new Point3d(x + dist_l * i, y + dist_nw + dist_w2jt, 0);
Point3d FromPt = new Point3d(x, y + dist_nw + dist_w2jt, 0);
Vector3d acVec3d = FromPt.GetVectorTo(targetPt);
Matrix3d mt = Matrix3d.Displacement(acVec3d);
Entity entCopy = pll2.GetTransformedCopy(mt);
btr.AppendEntity(entCopy);
trans.AddNewlyCreatedDBObject(entCopy, true);
}
//中间
double xx = x + dist_l;
double yy = y + dist_nw + dist_w2jt + dist_w * 2;
Point3dCollection coll = new Point3dCollection();
coll.Add(new Point3d(xx, yy, 0));
coll.Add(new Point3d(xx, yy - dist_w, 0));
coll.Add(new Point3d(xx + dist_l, yy - dist_w, 0));
coll.Add(new Point3d(xx + dist_l, yy, 0));
coll.Add(new Point3d(xx, yy, 0));
Polyline2d line2d = new Polyline2d(Poly2dType.SimplePoly, coll, 0, false, 0, 0, null);
line2d.SetDatabaseDefaults();
btr.AppendEntity(line2d);
trans.AddNewlyCreatedDBObject(line2d, true);
xx = xx + dist_tc1;
for (int i = 0; i < 16; i++)
{
Line l = new Line();
l.StartPoint = new Point3d(xx + 22.5 * bl, yy + 22.5 * bl, 0);
l.EndPoint = new Point3d(xx - 22.5 * bl, yy - 22.5 * bl, 0);
l.SetDatabaseDefaults();
btr.AppendEntity(l);
trans.AddNewlyCreatedDBObject(l, true);
Point3dCollection IP = new Point3dCollection();
l.IntersectWith(line2d, Intersect.ExtendThis, IP, IntPtr.Zero, IntPtr.Zero);
Polyline pll3 = new Polyline();
pll3.AddVertexAt(0, new Point2d(IP[0].X, IP[0].Y), 0, 0, 0);
pll3.AddVertexAt(1, new Point2d(IP[1].X, IP[1].Y), 0, 0, 0);
pll3.Layer = "9800";
pll3.Linetype = "Bylayer";
pll3.SetDatabaseDefaults();
btr.AppendEntity(pll3);
trans.AddNewlyCreatedDBObject(pll3, true);
xx = xx + dist_tc;
l.Erase();
}
line2d.Erase();
//using (ViewTableRecord view = doc.Editor.GetCurrentView())
//{
// view.Width = Math.Abs(ptcoll[1].X - ptcoll[0].X);
// view.Height = Math.Abs(ptcoll[1].X - ptcoll[0].X) + 60 * bl;
// view.CenterPoint = new Point2d(
// ptcoll[0].X + Math.Abs(ptcoll[1].X - ptcoll[0].X) / 2,
// ptcoll[0].Y + Math.Abs(ptcoll[2].Y - ptcoll[0].Y) / 2
// );
// doc.Editor.SetCurrentView(view);
//}
//doc.Editor.Regen();
trans.Commit();
}
//相交图幅
for (int i = 0; i < tf.Count; i++)
{
using (Transaction tran = doc.Database.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tran.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tran.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
Point3dCollection pts = new Point3dCollection();
Polyline pll = tran.GetObject(tf[i].id, OpenMode.ForWrite) as Polyline;
double bc = pll.Length / 4.0; //边长
pll.GetStretchPoints(pts);
sortpts(pts);
double x_check = Math.Abs(Math.Round(pts[0].X - ptcoll[3].X, 5));
double y_check = Math.Abs(Math.Round(pts[0].Y - y - dist_nw - dist_w2jt, 5));
double num_x = Math.Round(Math.Floor(x_check / bc), 3);
double num_y = Math.Round(Math.Floor(y_check / bc), 3);
double y_plus = (y_check % bc) * (dist_w / bc);
//x、y方向都错位
if (x_check % bc != 0 && y_check % bc != 0)
{
double y_plus_up = (Math.Abs(Math.Round(pts[1].Y - y - dist_nw - dist_w2jt, 5)) % bc) * (dist_w / bc);
double y_plus_down = (Math.Round(pts[0].Y - y - dist_nw - dist_w2jt, 5)) / bc * dist_w;
//左上上
if (pts[0].X < x && y_check / bc > 2)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * 3), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(x, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
//判断宽度和高度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_width = Math.Abs(pts[1].X - x);
double tfh_height = Math.Abs((dist_w * (3 - num_y) - y_plus));
if (tfh_width > ws * bl + (ws - 1) * (0.25 * bl) &&
tfh_height > 1.25 * bl)
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_y = y + dist_nw + dist_w2jt + dist_w * num_y + y_plus + (dist_w * (3 - num_y) - y_plus) / 2;
Point3d Topt_temp = new Point3d(x + (pts[1].X - x) / 2, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
}
//左上下
else if (pts[0].X < x && Math.Round(y_check / bc, 2) < 2 && Math.Round(y_check / bc, 2) > 1)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + dist_w * 2 + y_plus), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(x, y + dist_nw + dist_w2jt + dist_w * 2 + y_plus), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * 2 + y_plus), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
Polyline pll_ad2 = new Polyline();
pll_ad2.AddVertexAt(0, new Point2d(x, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad2.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad2.Layer = "9800";
pll_ad2.Linetype = "Bylayer";
pll_ad2.SetDatabaseDefaults();
btr.AppendEntity(pll_ad2);
tran.AddNewlyCreatedDBObject(pll_ad2, true);
//判断宽度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_width = Math.Abs(pts[1].X - x);
if (tfh_width > ws * bl + (ws - 1) * (0.25 * bl))
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_y = y + dist_nw + dist_w2jt + dist_w * 1.5 + y_plus;
Point3d Topt_temp = new Point3d(x + (pts[1].X - x) / 2, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
Point3dCollection ptscoll = new Point3dCollection();
ptscoll.Add(new Point3d(x + 0.01, y + dist_nw + dist_w2jt + dist_w * 2 + 0.01, 0));
ptscoll.Add(new Point3d(x + 0.01, y + dist_nw + dist_w2jt + dist_w * 2, 0));
Point3d bk = new Point3d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * 2, 0);
sele_dele(ptscoll, ed, tran, x, bk, btr);
}
//左下下
if (pts[0].X < x && y_plus_down < 0)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[1].X, y + dist_nw + dist_w2jt), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(x, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
//判断宽度和高度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_width = Math.Abs(pts[1].X - x);
double tfh_height = (dist_w - y_plus);
if (tfh_width > ws * bl + (ws - 1) * (0.25 * bl) &&
tfh_height > 1.25 * bl)
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_y = y + dist_nw + dist_w2jt + (dist_w - y_plus) / 2;
Point3d Topt_temp = new Point3d(x + (pts[1].X - x) / 2, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
}
//左下上
else if (pts[0].X < x && y_plus_down < dist_w && y_plus_down > 0)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + y_plus), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(x, y + dist_nw + dist_w2jt + y_plus), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + y_plus), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
Polyline pll_ad2 = new Polyline();
pll_ad2.AddVertexAt(0, new Point2d(x, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad2.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad2.Layer = "9800";
pll_ad2.Linetype = "Bylayer";
pll_ad2.SetDatabaseDefaults();
btr.AppendEntity(pll_ad2);
tran.AddNewlyCreatedDBObject(pll_ad2, true);
//判断宽度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_width = Math.Abs(pts[1].X - x);
if (tfh_width > ws * bl + (ws - 1) * (0.25 * bl))
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_y = y + dist_nw + dist_w2jt + y_plus + dist_w / 2;
Point3d Topt_temp = new Point3d(x + (pts[1].X - x) / 2, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
Point3dCollection ptscoll = new Point3dCollection();
ptscoll.Add(new Point3d(x + 0.01, y + dist_nw + dist_w2jt + dist_w + 0.01, 0));
ptscoll.Add(new Point3d(x + 0.01, y + dist_nw + dist_w2jt + dist_w, 0));
Point3d bk = new Point3d(pts[1].X, y + dist_nw + dist_w2jt + dist_w, 0);
sele_dele(ptscoll, ed, tran, x, bk, btr);
}
//右上上
if (pts[0].X > x + dist_l * 2 && y_check / bc > 2)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * 3), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(x + dist_l * 3, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
//判断宽度和高度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_width = Math.Abs(x + dist_l * 3 - pts[0].X);
double tfh_height = Math.Abs((dist_w * (3 - num_y) - y_plus));
if (tfh_width > ws * bl + (ws - 1) * (0.25 * bl) &&
tfh_height > 1.25 * bl)
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_x = x + dist_l * 3 - Math.Abs(x + dist_l * 3 - pts[0].X) / 2;
double tfh_y = y + dist_nw + dist_w2jt + dist_w * 2 + y_plus + (dist_w * (3 - num_y) - y_plus) / 2;
Point3d Topt_temp = new Point3d(tfh_x, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
}
//右上下
else if (pts[0].X > x + dist_l * 2 && Math.Round(y_check / bc, 2) < 2 && Math.Round(y_check / bc, 2) > 1)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * 2 + y_plus), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(x + dist_l * 3, y + dist_nw + dist_w2jt + dist_w * 2 + y_plus), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * 2 + y_plus), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
Polyline pll_ad2 = new Polyline();
pll_ad2.AddVertexAt(0, new Point2d(x + dist_l * 3, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad2.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad2.Layer = "9800";
pll_ad2.Linetype = "Bylayer";
pll_ad2.SetDatabaseDefaults();
btr.AppendEntity(pll_ad2);
tran.AddNewlyCreatedDBObject(pll_ad2, true);
//判断宽度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_width = Math.Abs(x + dist_l * 3 - pts[0].X);
if (tfh_width > ws * bl + (ws - 1) * (0.25 * bl))
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_x = x + dist_l * 3 - Math.Abs(x + dist_l * 3 - pts[0].X) / 2;
double tfh_y = y + dist_nw + dist_w2jt + dist_w * 1.5 + y_plus;
Point3d Topt_temp = new Point3d(tfh_x, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
Point3dCollection ptscoll = new Point3dCollection();
ptscoll.Add(new Point3d(x + 0.01, y + dist_nw + dist_w2jt + dist_w * 2 + 0.01, 0));
ptscoll.Add(new Point3d(x + 0.01, y + dist_nw + dist_w2jt + dist_w * 2, 0));
Point3d bk = new Point3d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * 2, 0);
sele_dele(ptscoll, ed, tran, x + dist_l * 3, bk, btr);
}
//右下下
if (pts[0].X > x + dist_l * 2 && y_plus_down < 0)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(x + dist_l * 3, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
//判断宽度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_width = Math.Abs(x + dist_l * 3 - pts[0].X);
double tfh_height = (dist_w - y_plus);
if (tfh_width > ws * bl + (ws - 1) * (0.25 * bl) &&
tfh_height > 1.25 * bl)
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_x = x + dist_l * 3 - Math.Abs(x + dist_l * 3 - pts[0].X) / 2;
double tfh_y = y + dist_nw + dist_w2jt + (dist_w - y_plus) / 2;
Point3d Topt_temp = new Point3d(tfh_x, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
}
//右下上
else if (pts[0].X > x + dist_l * 2 && y_plus_down < dist_w && y_plus_down > 0)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + y_plus), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(x + dist_l * 3, y + dist_nw + dist_w2jt + y_plus), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + y_plus), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
Polyline pll_ad2 = new Polyline();
pll_ad2.AddVertexAt(0, new Point2d(x + dist_l * 3, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad2.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w + y_plus), 0, 0, 0);
pll_ad2.Layer = "9800";
pll_ad2.Linetype = "Bylayer";
pll_ad2.SetDatabaseDefaults();
btr.AppendEntity(pll_ad2);
tran.AddNewlyCreatedDBObject(pll_ad2, true);
//判断宽度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_width = Math.Abs(x + dist_l * 3 - pts[0].X);
if (tfh_width > ws * bl + (ws - 1) * (0.25 * bl))
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_x = x + dist_l * 3 - Math.Abs(x + dist_l * 3 - pts[0].X) / 2;
double tfh_y = y + dist_nw + dist_w2jt + y_plus + dist_w / 2;
Point3d Topt_temp = new Point3d(tfh_x, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
Point3dCollection ptscoll = new Point3dCollection();
ptscoll.Add(new Point3d(x + 0.01, y + dist_nw + dist_w2jt + dist_w + 0.01, 0));
ptscoll.Add(new Point3d(x + 0.01, y + dist_nw + dist_w2jt + dist_w, 0));
Point3d bk = new Point3d(pts[0].X, y + dist_nw + dist_w2jt + dist_w, 0);
sele_dele(ptscoll, ed, tran, x + dist_l * 3, bk, btr);
}
//中上左
if (pts[0].X > x && pts[1].X < x + dist_l * 2 && y_check / bc > 2)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * 3), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
Polyline pll_ad2 = new Polyline();
pll_ad2.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad2.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad2.Layer = "9800";
pll_ad2.Linetype = "Bylayer";
pll_ad2.SetDatabaseDefaults();
btr.AppendEntity(pll_ad2);
tran.AddNewlyCreatedDBObject(pll_ad2, true);
//判断宽度和高度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_height = Math.Abs((dist_w * (3 - num_y) - y_plus));
if (tfh_height > 1.25 * bl)
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_y = y + dist_nw + dist_w2jt + dist_w * num_y + y_plus + (dist_w * (3 - num_y) - y_plus) / 2;
Point3d Topt_temp = new Point3d(pts[0].X + (pts[1].X - pts[0].X) / 2, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
}
//中上右
if (pts[0].X > x + dist_l && pts[1].X < x + dist_l * 3 && y_check / bc > 2)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * 3), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
Polyline pll_ad2 = new Polyline();
pll_ad2.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad2.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad2.Layer = "9800";
pll_ad2.Linetype = "Bylayer";
pll_ad2.SetDatabaseDefaults();
btr.AppendEntity(pll_ad2);
tran.AddNewlyCreatedDBObject(pll_ad2, true);
//判断宽度和高度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_height = Math.Abs((dist_w * (3 - num_y) - y_plus));
if (tfh_height > 1.25 * bl)
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_y = y + dist_nw + dist_w2jt + dist_w * num_y + y_plus + (dist_w * (3 - num_y) - y_plus) / 2;
Point3d Topt_temp = new Point3d(pts[0].X + (pts[1].X - pts[0].X) / 2, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
}
//中下左
if (pts[0].X > x && pts[1].X < x + dist_l * 2 && y_plus_down < 0)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
Polyline pll_ad2 = new Polyline();
pll_ad2.AddVertexAt(0, new Point2d(pts[1].X, y + dist_nw + dist_w2jt), 0, 0, 0);
pll_ad2.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad2.Layer = "9800";
pll_ad2.Linetype = "Bylayer";
pll_ad2.SetDatabaseDefaults();
btr.AppendEntity(pll_ad2);
tran.AddNewlyCreatedDBObject(pll_ad2, true);
//判断宽度和高度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_height = (dist_w - y_plus);
if (tfh_height > 1.25 * bl)
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_y = y + dist_nw + dist_w2jt + (dist_w - y_plus) / 2;
Point3d Topt_temp = new Point3d(pts[0].X + (pts[1].X - pts[0].X) / 2, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
}
//中下右
if (pts[0].X > x + dist_l && pts[1].X < x + dist_l * 3 && y_plus_down < 0)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[1].X, y + dist_nw + dist_w2jt), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
Polyline pll_ad1 = new Polyline();
pll_ad1.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad1.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad1.Layer = "9800";
pll_ad1.Linetype = "Bylayer";
pll_ad1.SetDatabaseDefaults();
btr.AppendEntity(pll_ad1);
tran.AddNewlyCreatedDBObject(pll_ad1, true);
Polyline pll_ad2 = new Polyline();
pll_ad2.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt), 0, 0, 0);
pll_ad2.AddVertexAt(1, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + (dist_w - y_plus)), 0, 0, 0);
pll_ad2.Layer = "9800";
pll_ad2.Linetype = "Bylayer";
pll_ad2.SetDatabaseDefaults();
btr.AppendEntity(pll_ad2);
tran.AddNewlyCreatedDBObject(pll_ad2, true);
//判断宽度和高度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数
int ws = tfh_temp.TextString.Length;
double tfh_height = (dist_w - y_plus);
if (tfh_height > 1.25 * bl)
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_y = y + dist_nw + dist_w2jt + (dist_w - y_plus) / 2;
Point3d Topt_temp = new Point3d(pts[0].X + (pts[1].X - pts[0].X) / 2, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
tfh_temp.Erase();
}
}
//x方向错位
else if (x_check % bc != 0)
{
//选择y方向竖线删除
Point3dCollection ptscoll = new Point3dCollection();
ptscoll.Add(new Point3d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + (dist_w / 2), 0));
ptscoll.Add(new Point3d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * num_y + (dist_w / 2), 0));
TypedValue[] value = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,"9800"),
new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE")
};
SelectionFilter filter = new SelectionFilter(value);
//dynamic acadApp = GrxCAD.ApplicationServices.Application.AcadApplication;
//acadApp.ZoomExtents();
PromptSelectionResult psr = ed.SelectFence(ptscoll, filter);
if (psr.Status == PromptStatus.OK)
{
SelectionSet ss = psr.Value;
ObjectIdCollection idcoll = new ObjectIdCollection(ss.GetObjectIds());
Polyline pll_delete = tran.GetObject(idcoll[0], OpenMode.ForWrite) as Polyline;
//判断选中多条线段后情况
if (idcoll.Count > 1)
{
Polyline temp1 = tran.GetObject(idcoll[0], OpenMode.ForWrite) as Polyline;
Polyline temp2 = tran.GetObject(idcoll[1], OpenMode.ForWrite) as Polyline;
if (temp1.Length > temp2.Length)
{
pll_delete = temp1;
}
else
{
pll_delete = temp2;
}
}
//有相交但超出左范围
if (pll_delete.StartPoint.X == x)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * num_y), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + dist_w * (num_y + 1)), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
//判断宽度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数判断是否需要保留
int ws = tfh_temp.TextString.Length;
if (Math.Abs(pts[1].X - x) > ws * bl + (ws - 1) * (0.25 * bl))
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号x坐标计算
//double tfh_x = Math.Round(x + (pts[1].X - x) / 2);
double tfh_x = x + (pts[1].X - x) / 2;
Point3d Topt_temp = new Point3d(tfh_x, y + dist_nw + dist_w2jt + dist_w * (num_y) + dist_w / 2, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
{
tfh_temp.Erase();
}
//删除接图表内左竖线
Point3dCollection deleteptscoll = new Point3dCollection();
deleteptscoll.Add(new Point3d(x + dist_l, y + dist_nw + dist_w2jt + dist_w * num_y + (dist_w / 2), 0));
deleteptscoll.Add(new Point3d(x + dist_l + 0.01, y + dist_nw + dist_w2jt + dist_w * num_y + (dist_w / 2), 0));
TypedValue[] deletevalue = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,"9800"),
new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE")
};
SelectionFilter deletefilter = new SelectionFilter(deletevalue);
//acadApp.ZoomExtents();
PromptSelectionResult deletepsr = ed.SelectFence(deleteptscoll, deletefilter);
//acadApp.ZoomPrevious();
if (deletepsr.Status == PromptStatus.OK)
{
SelectionSet deletess = deletepsr.Value;
ObjectIdCollection deleteidcoll = new ObjectIdCollection(deletess.GetObjectIds());
Polyline deletepll = tran.GetObject(deleteidcoll[0], OpenMode.ForWrite) as Polyline;
Point3dCollection pt_break = new Point3dCollection();
DBObjectCollection obj = new DBObjectCollection();
if (num_y == 0)
{
pt_break.Add(new Point3d(deletepll.StartPoint.X, y + dist_nw + dist_w2jt + dist_w, 0));
obj = deletepll.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.StartPoint.Y == y + dist_nw + dist_w2jt ||
pll_delete1.EndPoint.Y == y + dist_nw + dist_w2jt)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
deletepll.Erase();
}
else
{
pt_break.Add(new Point3d(deletepll.StartPoint.X, y + dist_nw + dist_w2jt + dist_w * num_y, 0));
obj = deletepll.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.StartPoint.Y == y + dist_nw + dist_w2jt + dist_w * 3 ||
pll_delete1.EndPoint.Y == y + dist_nw + dist_w2jt + dist_w * 3)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
deletepll.Erase();
}
}
}
//有相交但超出右范围
else if (pll_delete.StartPoint.X == x + dist_l * 3)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(pts[3].X, y + dist_nw + dist_w2jt + dist_w * (num_y + 1)), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
int ws = tfh_temp.TextString.Length;//计算图幅号位数判断是否需要保留
if (Math.Abs(x + dist_l * 3 - pts[0].X) > ws * bl + (ws - 1) * (0.25 * bl))
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号x坐标计算
//double tfh_x = Math.Round(x + dist_l * 3 - Math.Abs(x + dist_l * 3 - pts[0].X) / 2);
double tfh_x = x + dist_l * 3 - Math.Abs(x + dist_l * 3 - pts[0].X) / 2;
Point3d Topt_temp = new Point3d(tfh_x, y + dist_nw + dist_w2jt + dist_w * (num_y) + dist_w / 2, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
{
tfh_temp.Erase();
}
//删除接图表内右竖线
Point3dCollection deleteptscoll = new Point3dCollection();
deleteptscoll.Add(new Point3d(x + dist_l * 2, y + dist_nw + dist_w2jt + dist_w * num_y + (dist_w / 2), 0));
deleteptscoll.Add(new Point3d(x + dist_l * 2 + 0.01, y + dist_nw + dist_w2jt + dist_w * num_y + (dist_w / 2), 0));
TypedValue[] deletevalue = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,"9800"),
new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE")
};
SelectionFilter deletefilter = new SelectionFilter(deletevalue);
//acadApp.ZoomExtents();
PromptSelectionResult deletepsr = ed.SelectFence(deleteptscoll, deletefilter);
//acadApp.ZoomPrevious();
if (deletepsr.Status == PromptStatus.OK)
{
SelectionSet deletess = deletepsr.Value;
ObjectIdCollection deleteidcoll = new ObjectIdCollection(deletess.GetObjectIds());
Polyline deletepll = tran.GetObject(deleteidcoll[0], OpenMode.ForWrite) as Polyline;
Point3dCollection pt_break = new Point3dCollection();
DBObjectCollection obj = new DBObjectCollection();
if (num_y == 0)
{
pt_break.Add(new Point3d(deletepll.StartPoint.X, y + dist_nw + dist_w2jt + dist_w, 0));
obj = deletepll.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.StartPoint.Y == y + dist_nw + dist_w2jt ||
pll_delete1.EndPoint.Y == y + dist_nw + dist_w2jt)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
deletepll.Erase();
}
else
{
pt_break.Add(new Point3d(deletepll.StartPoint.X, y + dist_nw + dist_w2jt + dist_w * num_y, 0));
obj = deletepll.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.StartPoint.Y == y + dist_nw + dist_w2jt + dist_w * 3 ||
pll_delete1.EndPoint.Y == y + dist_nw + dist_w2jt + dist_w * 3)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
deletepll.Erase();
}
}
}
else
{
//if (cw_x != pts[0].Y)
//{
// zj_x.Add(tf[i]);
// flag_x = 1;
// cw_x = pts[0].Y;
//}
//else if (cw_x == pts[0].Y && flag_x == 1)
//{
// zj_x.RemoveAt(zj_x.Count - 1);
// flag_x = 0;
//}
//if (cw_x.Count != 0)
//{
// int flag = 0;
// int cf = 0;
// for (int ii = 0; ii < cw_x.Count; ii++)
// {
// if (cw_x[ii].Y != pts[0].Y)
// flag = 1;
// else
// {
// flag = 0;
// cf = ii;
// }
// }
// if(flag == 1)
// {
// zj_x.Add(tf[i]);
// cw_x.Add(pts[0]);
// }
// else
// {
// zj_x.RemoveAt(cf);
// cw_x.RemoveAt(cf);
// }
//}
//else
//{
// zj_x.Add(tf[i]);
// cw_x.Add(pts[0]);
//}
cw_x.Add(pts[0]);
zj_x.Add(tf[i]);
Point3dCollection pt_break = new Point3dCollection();
DBObjectCollection obj = new DBObjectCollection();
if (pll_delete.Length != 12 * bl / 3)
{
pt_break.Add(new Point3d(pll_delete.StartPoint.X, y + dist_nw
+ dist_w2jt + ((num_y + 2) / 2) * dist_w, 0));
obj = pll_delete.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.Length < pll_delete2.Length)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else if (pll_delete1.Length == pll_delete2.Length)
{
if (pll_delete1.StartPoint.Y == y + dist_nw + dist_w2jt ||
pll_delete1.EndPoint.Y == y + dist_nw + dist_w2jt ||
pll_delete1.EndPoint.Y == y + dist_nw + dist_w2jt + dist_w * 3 ||
pll_delete1.StartPoint.Y == y + dist_nw + dist_w2jt + dist_w * 3)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
}
pll_delete.Erase();
Polyline pll_cg = new Polyline();
pll_cg.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y), 0, 0, 0);
//pll_cg.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * num_y), 0, 0, 0);
//pll_cg.AddVertexAt(2, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + dist_w * (num_y + 1)), 0, 0, 0);
pll_cg.AddVertexAt(1, new Point2d(pts[3].X, y + dist_nw + dist_w2jt + dist_w * (num_y + 1)), 0, 0, 0);
//pll_cg.AddVertexAt(4, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y), 0, 0, 0);
Polyline pll_cg_1 = new Polyline();
pll_cg_1.AddVertexAt(0, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * num_y), 0, 0, 0);
pll_cg_1.AddVertexAt(1, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + dist_w * (num_y + 1)), 0, 0, 0);
pll_cg.Layer = "9800";
pll_cg.Linetype = "Bylayer";
pll_cg.SetDatabaseDefaults();
btr.AppendEntity(pll_cg);
tran.AddNewlyCreatedDBObject(pll_cg, true);
pll_cg_1.Layer = "9800";
pll_cg_1.Linetype = "Bylayer";
pll_cg_1.SetDatabaseDefaults();
btr.AppendEntity(pll_cg_1);
tran.AddNewlyCreatedDBObject(pll_cg_1, true);
DBText tfh = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh.HorizontalMode = TextHorizontalMode.TextCenter;
tfh.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh.AlignmentPoint = tfh.Position;
Point3d Frompt = new Point3d(tfh.AlignmentPoint.X, tfh.AlignmentPoint.Y, tfh.AlignmentPoint.Z);
Point3d Topt = new Point3d(pts[0].X + (pts[1].X - pts[0].X) / 2, y + dist_nw + dist_w2jt + dist_w * (num_y) + dist_w / 2, tfh.AlignmentPoint.Z);
Vector3d acVec3d = Frompt.GetVectorTo(Topt);
tfh.TransformBy(Matrix3d.Displacement(acVec3d));
tfh.Layer = "9800";
tfh.ColorIndex = 4;
tfh.Height = 1.25 * bl;
tfh.TextStyleId = HZ;
}
}
}
//y方向错位
else if (y_check % bc != 0)
{
double y_plus1 = (Math.Round(pts[0].Y - y - dist_nw - dist_w2jt, 5) / bc) * dist_w;
double y_plus2 = (Math.Round(pts[2].Y - y - dist_nw - dist_w2jt, 5) / bc) * dist_w;
if (y_plus1 < 0)
y_plus1 = 0;
Point3dCollection ptscoll = new Point3dCollection();
ptscoll.Add(new Point3d(x + dist_l * num_x + 0.01, y + dist_nw + dist_w2jt + y_plus1, 0));
ptscoll.Add(new Point3d(x + dist_l * num_x + 0.01, y + dist_nw + dist_w2jt + y_plus2, 0));
TypedValue[] value = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,"9800"),
new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE")
};
SelectionFilter filter = new SelectionFilter(value);
//dynamic acadApp = GrxCAD.ApplicationServices.Application.AcadApplication;
//acadApp.ZoomExtents();
PromptSelectionResult psr = ed.SelectFence(ptscoll, filter);
//acadApp.ZoomPrevious();
if (psr.Status == PromptStatus.OK)
{
SelectionSet ss = psr.Value;
ObjectIdCollection idcoll = new ObjectIdCollection(ss.GetObjectIds());
Polyline pll_delete = tran.GetObject(idcoll[0], OpenMode.ForWrite) as Polyline;
if (idcoll.Count > 1)
{
Polyline temp1 = tran.GetObject(idcoll[0], OpenMode.ForWrite) as Polyline;
Polyline temp2 = tran.GetObject(idcoll[1], OpenMode.ForWrite) as Polyline;
if (temp1.Length > temp2.Length)
{
pll_delete = temp1;
}
else
{
pll_delete = temp2;
}
}
//有相交但超出上方
if (pll_delete.StartPoint.Y == y + dist_nw + dist_w2jt + dist_w * 3)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(x + dist_l * num_x, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(x + dist_l * (num_x + 1), y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
//判断高度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数判断是否需要保留
int ws = tfh_temp.TextString.Length;
if (Math.Abs((dist_w * (3 - num_y) - y_plus)) > 1.25 * bl)
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_y = y + dist_nw + dist_w2jt + dist_w * num_y + y_plus + (dist_w * (3 - num_y) - y_plus) / 2;
Point3d Topt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
{
tfh_temp.Erase();
}
//删除接图表内上横线
Point3dCollection deleteptscoll = new Point3dCollection();
deleteptscoll.Add(new Point3d(x + dist_l / 2 + dist_l * num_x, y + dist_nw + dist_w2jt + dist_w * 2, 0));
deleteptscoll.Add(new Point3d(x + dist_l / 2 + dist_l * num_x, y + dist_nw + dist_w2jt + dist_w * 2 + 0.01, 0));
TypedValue[] deletevalue = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,"9800"),
new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE")
};
SelectionFilter deletefilter = new SelectionFilter(deletevalue);
//acadApp.ZoomExtents();
PromptSelectionResult deletepsr = ed.SelectFence(deleteptscoll, deletefilter);
//acadApp.ZoomPrevious();
if (deletepsr.Status == PromptStatus.OK)
{
SelectionSet deletess = deletepsr.Value;
ObjectIdCollection deleteidcoll = new ObjectIdCollection(deletess.GetObjectIds());
Polyline deletepll = tran.GetObject(deleteidcoll[0], OpenMode.ForWrite) as Polyline;
Point3dCollection pt_break = new Point3dCollection();
DBObjectCollection obj = new DBObjectCollection();
if (num_x == 0)
{
pt_break.Add(new Point3d(x + dist_l, deletepll.StartPoint.Y, 0));
obj = deletepll.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.StartPoint.X == x ||
pll_delete1.EndPoint.Y == x)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
deletepll.Erase();
}
else
{
pt_break.Add(new Point3d(x + dist_l * 2, deletepll.StartPoint.Y, 0));
obj = deletepll.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.StartPoint.Y == x + dist_l * 3 ||
pll_delete1.EndPoint.Y == x + dist_l * 3)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
deletepll.Erase();
}
}
}
//有相交但超出下方
else if (pll_delete.StartPoint.Y == y + dist_nw + dist_w2jt)
{
Polyline pll_ad = new Polyline();
pll_ad.AddVertexAt(0, new Point2d(x + dist_l * num_x, y + dist_nw + dist_w2jt + dist_w * num_y + (dist_w - y_plus)), 0, 0, 0);
pll_ad.AddVertexAt(1, new Point2d(x + dist_l * (num_x + 1), y + dist_nw + dist_w2jt + dist_w * num_y + (dist_w - y_plus)), 0, 0, 0);
pll_ad.Layer = "9800";
pll_ad.Linetype = "Bylayer";
pll_ad.SetDatabaseDefaults();
btr.AppendEntity(pll_ad);
tran.AddNewlyCreatedDBObject(pll_ad, true);
//判断高度能否放下文字
DBText tfh_temp = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh_temp.TextStyleId = HZ;
tfh_temp.HorizontalMode = TextHorizontalMode.TextCenter;
tfh_temp.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh_temp.AlignmentPoint = tfh_temp.Position;
//计算图幅号位数判断是否需要保留
int ws = tfh_temp.TextString.Length;
if (dist_w - y_plus > 1.25 * bl)
{
Point3d Frompt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_temp.AlignmentPoint.Y, tfh_temp.AlignmentPoint.Z);
//图幅号y坐标计算
double tfh_y = y + dist_nw + dist_w2jt + (dist_w - y_plus) / 2;
Point3d Topt_temp = new Point3d(tfh_temp.AlignmentPoint.X, tfh_y, tfh_temp.AlignmentPoint.Z);
Vector3d acVec3d_temp = Frompt_temp.GetVectorTo(Topt_temp);
tfh_temp.TransformBy(Matrix3d.Displacement(acVec3d_temp));
tfh_temp.Layer = "9800";
tfh_temp.ColorIndex = 4;
tfh_temp.Height = 1.25 * bl;
}
else
{
tfh_temp.Erase();
}
//删除接图表内下横线
Point3dCollection deleteptscoll = new Point3dCollection();
deleteptscoll.Add(new Point3d(x + dist_l / 2 + dist_l * num_x, y + dist_nw + dist_w2jt + dist_w, 0));
deleteptscoll.Add(new Point3d(x + dist_l / 2 + dist_l * num_x, y + dist_nw + dist_w2jt + dist_w + 0.01, 0));
TypedValue[] deletevalue = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,"9800"),
new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE")
};
SelectionFilter deletefilter = new SelectionFilter(deletevalue);
//acadApp.ZoomExtents();
PromptSelectionResult deletepsr = ed.SelectFence(deleteptscoll, deletefilter);
//acadApp.ZoomPrevious();
if (deletepsr.Status == PromptStatus.OK)
{
SelectionSet deletess = deletepsr.Value;
ObjectIdCollection deleteidcoll = new ObjectIdCollection(deletess.GetObjectIds());
Polyline deletepll = tran.GetObject(deleteidcoll[0], OpenMode.ForWrite) as Polyline;
Point3dCollection pt_break = new Point3dCollection();
DBObjectCollection obj = new DBObjectCollection();
if (num_x == 0)
{
pt_break.Add(new Point3d(x + dist_l, deletepll.StartPoint.Y, 0));
obj = deletepll.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.StartPoint.X == x ||
pll_delete1.EndPoint.Y == x)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
deletepll.Erase();
}
else
{
pt_break.Add(new Point3d(x + dist_l * 2, deletepll.StartPoint.Y, 0));
obj = deletepll.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.StartPoint.Y == x + dist_l * 3 ||
pll_delete1.EndPoint.Y == x + dist_l * 3)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
deletepll.Erase();
}
}
}
else
{
//if (cw_y != pts[0].X)
//{
// zj_y.Add(tf[i]);
// flag_y = 1;
// cw_y = pts[0].X;
//}
//else if (cw_y == pts[0].X && flag_y == 1)
//{
// zj_y.RemoveAt(zj_y.Count - 1);
// flag_y = 0;
//}
//if (cw_y.Count != 0)
//{
// int flag = 0;
// int cf = 0;
// for (int ii = 0; ii < cw_y.Count; ii++)
// {
// if (cw_y[ii].X != pts[0].X)
// flag = 1;
// else
// {
// flag = 0;
// cf = ii;
// }
// }
// if (flag == 1)
// {
// zj_y.Add(tf[i]);
// cw_y.Add(pts[0]);
// }
// else
// {
// zj_y.RemoveAt(cf);
// cw_y.RemoveAt(cf);
// }
//}
//else
//{
// zj_y.Add(tf[i]);
// cw_y.Add(pts[0]);
//}
cw_y.Add(pts[0]);
zj_y.Add(tf[i]);
if (pll_delete.Length != 22.5 * bl / 3)
{
Point3dCollection pt_break = new Point3dCollection();
DBObjectCollection obj = new DBObjectCollection();
pt_break.Add(new Point3d(x + (((num_x + 2) / 2) * dist_l), y + dist_nw
+ dist_w2jt + (num_y + 1) * dist_w, 0));
obj = pll_delete.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.Length < pll_delete2.Length)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else if (pll_delete1.Length == pll_delete2.Length)
{
if (pll_delete1.StartPoint.X == x || pll_delete1.EndPoint.X == x ||
pll_delete1.EndPoint.X == x + dist_l * 3 || pll_delete1.StartPoint.X == x + dist_l * 3)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
}
pll_delete.Erase();
Polyline pll_cg_1 = new Polyline();
pll_cg_1.AddVertexAt(0, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_cg_1.AddVertexAt(1, new Point2d(pts[1].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
Polyline pll_cg_2 = new Polyline();
pll_cg_2.AddVertexAt(0, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + dist_w * (num_y + 1) + y_plus), 0, 0, 0);
pll_cg_2.AddVertexAt(1, new Point2d(pts[3].X, y + dist_nw + dist_w2jt + dist_w * (num_y + 1) + y_plus), 0, 0, 0);
//pll_cg.AddVertexAt(2, new Point2d(pts[2].X, y + dist_nw + dist_w2jt + dist_w * (num_y + 1) + y_plus), 0, 0, 0);
//pll_cg_1.AddVertexAt(3, new Point2d(pts[3].X, y + dist_nw + dist_w2jt + dist_w * (num_y + 1) + y_plus), 0, 0, 0);
//pll_cg.AddVertexAt(4, new Point2d(pts[0].X, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus), 0, 0, 0);
pll_cg_1.Layer = "9800";
pll_cg_1.Linetype = "Bylayer";
pll_cg_1.SetDatabaseDefaults();
btr.AppendEntity(pll_cg_1);
tran.AddNewlyCreatedDBObject(pll_cg_1, true);
pll_cg_2.Layer = "9800";
pll_cg_2.Linetype = "Bylayer";
pll_cg_2.SetDatabaseDefaults();
btr.AppendEntity(pll_cg_2);
tran.AddNewlyCreatedDBObject(pll_cg_2, true);
DBText tfh = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh.HorizontalMode = TextHorizontalMode.TextCenter;
tfh.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh.AlignmentPoint = tfh.Position;
Point3d Frompt = new Point3d(tfh.AlignmentPoint.X, tfh.AlignmentPoint.Y, tfh.AlignmentPoint.Z);
Point3d Topt = new Point3d(pts[0].X + (pts[1].X - pts[0].X) / 2, y + dist_nw + dist_w2jt + dist_w * num_y + y_plus + dist_w / 2, tfh.AlignmentPoint.Z);
Vector3d acVec3d = Frompt.GetVectorTo(Topt);
tfh.TransformBy(Matrix3d.Displacement(acVec3d));
tfh.Layer = "9800";
tfh.ColorIndex = 4;
tfh.Height = 1.25 * bl;
tfh.TextStyleId = HZ;
}
}
}
else
{
DBText tfh1 = tran.GetObject(tf[i].tfhid, OpenMode.ForWrite) as DBText;
tfh1.HorizontalMode = TextHorizontalMode.TextCenter;
tfh1.VerticalMode = TextVerticalMode.TextVerticalMid;
tfh1.AlignmentPoint = tfh1.Position;
Point3d Frompt1 = new Point3d(tfh1.AlignmentPoint.X, tfh1.AlignmentPoint.Y, tfh1.AlignmentPoint.Z);
Point3d Topt1 = new Point3d(x + dist_l * num_x + dist_l / 2, y + dist_nw + dist_w2jt + dist_w * (num_y) + dist_w / 2, tfh1.AlignmentPoint.Z);
Vector3d acVec3d1 = Frompt1.GetVectorTo(Topt1);
tfh1.TransformBy(Matrix3d.Displacement(acVec3d1));
tfh1.Layer = "9800";
tfh1.ColorIndex = 4;
tfh1.Height = 1.25 * bl;
tfh1.TextStyleId = HZ;
}
//pll.Erase();
tran.Commit();
}
}
List delex = new List();//不需要删除对应竖线的x方向错位框
List deley = new List();//不需要删除对应横线的y方向错位框
//如果同一列中有两个y方向错位图框,由于在y方向错位时已经进行了对应横线的
//删除,所以将序号加入列表中,不需要再删除。
for (int i = 0; i < zj_y.Count - 1; i++)
{
for (int ii = i + 1; ii < zj_y.Count; ii++)
{
if (cw_y[i].X == cw_y[ii].X)
{
deley.Add(i);
deley.Add(ii);
}
}
}
//如果同一行中有两个x方向错位图框,由于在x方向错位时已经进行了对应竖线的
//删除,所以将序号加入列表中,不需要再删除。
for (int i = 0; i < zj_x.Count - 1; i++)
{
for (int ii = i + 1; ii < zj_x.Count; ii++)
{
if (cw_x[i].Y == cw_x[ii].Y)
{
delex.Add(i);
delex.Add(ii);
}
}
}
//如果同时有x方向错位和y方向错位且在同一个角,不需要再删除
for (int i = 0; i < zj_x.Count; i++)
{
for (int ii = 0; ii < zj_y.Count; ii++)
{
if (Math.Abs(cw_x[i].X - cw_y[ii].X) > dist_l &&
Math.Abs(cw_x[i].Y - cw_y[ii].Y) > dist_l &&
!delex.Contains(i))
delex.Add(i);
else if (Math.Abs(cw_x[i].X - cw_y[ii].X) < dist_l &&
!deley.Contains(ii))
deley.Add(ii);
else if (Math.Abs(cw_x[i].Y - cw_y[ii].Y) < dist_l &&
!delex.Contains(i))
delex.Add(i);
}
}
if (zj_x.Count != 0)
{
delecentrol(doc, x, y, dist_l, dist_w, dist_nw, dist_w2jt, zj_x, delex, ptcoll, 0);
}
if (zj_y.Count != 0)
{
delecentrol(doc, x, y, dist_l, dist_w, dist_nw, dist_w2jt, zj_y, deley, ptcoll, 1);
}
//删除图框
for (int i = 0; i < tf.Count; i++)
{
using (Transaction tran = doc.Database.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tran.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tran.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
Point3dCollection pts = new Point3dCollection();
Polyline pll = tran.GetObject(tf[i].id, OpenMode.ForWrite) as Polyline;
pll.Erase();
if (i == tf.Count - 1)
{
LayerTable layerTable = tran.GetObject(doc.Database.LayerTableId, OpenMode.ForWrite) as LayerTable;
LayerTableRecord layer = tran.GetObject(layerTable[tc_tfh], OpenMode.ForWrite) as LayerTableRecord;
layer.Erase(true);
if (tc_tfh != tc_tk)
{
layer = tran.GetObject(layerTable[tc_tk], OpenMode.ForWrite) as LayerTableRecord;
layer.Erase(true); // 删除图层
}
}
tran.Commit();
}
}
}
///
/// x、y方向错位竖\横线删除
///
private void delecentrol(Document doc, double x, double y, double dist_l, double dist_w,
double dist_nw, double dist_w2jt, List tk, List deleindex, Point3dCollection ptcoll, int index)
{
//x方向错位竖线删除
if (index == 0)
{
for (int i = 0; i < tk.Count; i++)
{
if (deleindex.Contains(i))
continue;
using (Transaction tran = doc.Database.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tran.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tran.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
Point3dCollection pts = new Point3dCollection();
Polyline pll = tran.GetObject(tk[i].id, OpenMode.ForWrite) as Polyline;
double bc = pll.Length / 4.0; //边长
pll.GetStretchPoints(pts);
sortpts(pts);
double x_check = Math.Round(pts[0].X - ptcoll[3].X, 5);
double y_check = Math.Round(pts[0].Y - y - dist_nw - dist_w2jt, 5);
double num_x = Math.Round(Math.Floor(x_check / bc), 3);
double num_y = Math.Round(Math.Floor(y_check / bc), 3);
Point3dCollection ptscoll = new Point3dCollection();
//右错位
if (pts[0].X > x + dist_l)
{
ptscoll.Add(new Point3d(x + dist_l, y + dist_nw + dist_w2jt + dist_w * num_y + dist_w / 2, 0));
ptscoll.Add(new Point3d(x + dist_l + 0.01, y + dist_nw + dist_w2jt + dist_w * num_y + dist_w / 2, 0));
}
//左错位
else
{
ptscoll.Add(new Point3d(x + dist_l * 2, y + dist_nw + dist_w2jt + dist_w * num_y + dist_w / 2, 0));
ptscoll.Add(new Point3d(x + dist_l * 2 + 0.01, y + dist_nw + dist_w2jt + dist_w * num_y + dist_w / 2, 0));
}
TypedValue[] value = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,"9800"),
new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE")
};
SelectionFilter filter = new SelectionFilter(value);
dynamic acadApp = GrxCAD.ApplicationServices.Application.AcadApplication;
acadApp.ZoomExtents();
PromptSelectionResult psr = ed.SelectFence(ptscoll, filter);
acadApp.ZoomPrevious();
if (psr.Status == PromptStatus.OK)
{
SelectionSet ss = psr.Value;
ObjectIdCollection idcoll = new ObjectIdCollection(ss.GetObjectIds());
Polyline pll_delete = tran.GetObject(idcoll[0], OpenMode.ForWrite) as Polyline;
Point3dCollection pt_break = new Point3dCollection();
DBObjectCollection obj = new DBObjectCollection();
int num = 0;
if (num_y / 2 == 0)
num = 1;
else if (num_y / 2 == 1)
num = 2;
pt_break.Add(new Point3d(pll_delete.StartPoint.X, y + dist_nw + dist_w2jt + dist_w * num, 0));
obj = pll_delete.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (num == 1 && pll_delete1.StartPoint.Y == y + dist_nw + dist_w2jt ||
num == 1 && pll_delete1.EndPoint.Y == y + dist_nw + dist_w2jt)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
pll_delete.Erase();
}
tran.Commit();
}
}
}
//y方向错位横线删除
if (index == 1)
{
for (int i = 0; i < tk.Count; i++)
{
if (deleindex.Contains(i))
continue;
using (Transaction tran = doc.Database.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tran.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tran.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
Point3dCollection pts = new Point3dCollection();
Polyline pll = tran.GetObject(tk[i].id, OpenMode.ForWrite) as Polyline;
double bc = pll.Length / 4.0; //边长
pll.GetStretchPoints(pts);
sortpts(pts);
double x_check = Math.Round(pts[0].X - ptcoll[3].X, 5);
double y_check = Math.Round(pts[0].Y - y - dist_nw - dist_w2jt, 5);
double num_x = Math.Round(Math.Floor(x_check / bc), 3);
double num_y = Math.Round(Math.Floor(y_check / bc), 3);
double y_plus = (y_check % bc) * (dist_w / bc);
Point3dCollection ptscoll = new Point3dCollection();
//下错位
if (y + dist_nw + dist_w2jt + dist_w * num_y + y_plus < y + dist_nw + dist_w2jt + dist_w)
{
ptscoll.Add(new Point3d(x + dist_l / 2, y + dist_nw + dist_w2jt + dist_w * 2, 0));
ptscoll.Add(new Point3d(x + dist_l / 2, y + dist_nw + dist_w2jt + dist_w * 2 + 0.01, 0));
}
//上错位
else
{
ptscoll.Add(new Point3d(x + dist_l / 2, y + dist_nw + dist_w2jt + dist_w, 0));
ptscoll.Add(new Point3d(x + dist_l / 2, y + dist_nw + dist_w2jt + dist_w + 0.01, 0));
}
TypedValue[] value = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,"9800"),
new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE")
};
SelectionFilter filter = new SelectionFilter(value);
dynamic acadApp = GrxCAD.ApplicationServices.Application.AcadApplication;
acadApp.ZoomExtents();
PromptSelectionResult psr = ed.SelectFence(ptscoll, filter);
acadApp.ZoomPrevious();
if (psr.Status == PromptStatus.OK)
{
SelectionSet ss = psr.Value;
ObjectIdCollection idcoll = new ObjectIdCollection(ss.GetObjectIds());
Polyline pll_delete = tran.GetObject(idcoll[0], OpenMode.ForWrite) as Polyline;
Point3dCollection pt_break = new Point3dCollection();
DBObjectCollection obj = new DBObjectCollection();
int num = 0;
if (num_x / 2 == 0)
num = 1;
else if (num_x / 2 == 1)
num = 2;
pt_break.Add(new Point3d(x + dist_l * num, pll_delete.StartPoint.Y, 0));
obj = pll_delete.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (num == 1 && pll_delete1.StartPoint.X == x ||
num == 1 && pll_delete1.EndPoint.X == x)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
pll_delete.Erase();
}
tran.Commit();
}
}
}
}
///
/// x、y方向都错位时删除对应方向的竖\横线
///
private void sele_dele(Point3dCollection ptscoll, Editor ed, Transaction tran, double by, Point3d bk, BlockTableRecord btr)
{
TypedValue[] value = new TypedValue[]
{
new TypedValue((int)DxfCode.LayerName,"9800"),
new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE")
};
SelectionFilter filter = new SelectionFilter(value);
dynamic acadApp = GrxCAD.ApplicationServices.Application.AcadApplication;
acadApp.ZoomExtents();
PromptSelectionResult psr = ed.SelectFence(ptscoll, filter);
acadApp.ZoomPrevious();
if (psr.Status == PromptStatus.OK)
{
SelectionSet ss = psr.Value;
ObjectIdCollection idcoll = new ObjectIdCollection(ss.GetObjectIds());
Polyline pll_delete = tran.GetObject(idcoll[0], OpenMode.ForWrite) as Polyline;
Point3dCollection pt_break = new Point3dCollection();
DBObjectCollection obj = new DBObjectCollection();
pt_break.Add(bk);
obj = pll_delete.GetSplitCurves(pt_break);
Polyline pll_delete1 = obj[0] as Polyline;
Polyline pll_delete2 = obj[1] as Polyline;
if (pll_delete1.StartPoint.X == by ||
pll_delete1.EndPoint.X == by)
{
pll_delete2.SetDatabaseDefaults();
btr.AppendEntity(pll_delete2);
tran.AddNewlyCreatedDBObject(pll_delete2, true);
}
else
{
pll_delete1.SetDatabaseDefaults();
btr.AppendEntity(pll_delete1);
tran.AddNewlyCreatedDBObject(pll_delete1, true);
}
pll_delete.Erase();
}
}
public ObjectId createTextStyle(Document doc)
{
Database database = doc.Database;
ObjectId textstyleID = new ObjectId();
string stylename = "HZ";
using (Transaction traction = database.TransactionManager.StartTransaction())
{
TextStyleTable styletable = traction.GetObject(database.TextStyleTableId, OpenMode.ForWrite) as TextStyleTable;
if (styletable.Has(stylename) == false)
{
TextStyleTableRecord R1 = new TextStyleTableRecord();
R1.Name = stylename;
//R1.FileName = "方正细等线简体";
R1.FileName = "rs.shx";
R1.BigFontFileName = "hztxt.shx";
R1.ObliquingAngle = 0;
R1.XScale = 0.75;
//textstyleID = styletable.Add(R1);
traction.AddNewlyCreatedDBObject(R1, true);
//database.TextStyleId = textstyleID;
}
traction.Commit();
}
using (Transaction traction = database.TransactionManager.StartTransaction())
{
TextStyleTable styletable = traction.GetObject(database.TextStyleTableId, OpenMode.ForWrite) as TextStyleTable;
TextStyleTableRecord record = traction.GetObject(styletable[stylename], OpenMode.ForRead) as TextStyleTableRecord;
textstyleID = record.ObjectId;
traction.Commit();
}
return textstyleID;
}
}
}