public void MyCommand() // This method can have any name { // Put your command code here Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; string ClipLayerName = "TK-视口"; using (Transaction Trans = db.TransactionManager.StartTransaction()) { try { //获取布局列表(剔除模型空间) DBDictionary Layouts = Trans.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary; ArrayList Layoutlist = new ArrayList(); foreach (DBDictionaryEntry item in Layouts) { if (item.Key != "Model") { Layout layoutobject = Trans.GetObject(item.Value, OpenMode.ForRead) as Layout; Layoutlist.Add(layoutobject); } } //获取view列表,注意哦,是symbotable,不能用viewtable,会闪退 SymbolTable MyVt = Trans.GetObject(db.ViewTableId, OpenMode.ForRead) as SymbolTable; ArrayList viewlist = new ArrayList(); foreach (ObjectId viewID in MyVt) { ViewTableRecord VR = Trans.GetObject(viewID, OpenMode.ForRead) as ViewTableRecord; viewlist.Add(VR); //ed.WriteMessage("\nhehe:{0}", viewID.ToString()); } LayerStateManager layerState = db.LayerStateManager; /* * foreach(ViewTableRecord VR in viewlist) * { * * ed.WriteMessage("\n视图名:{0}", VR.Name); * ed.WriteMessage("\n视图中心坐标:{0}", VR.CenterPoint); * ed.WriteMessage("\n视图高度:{0}", VR.Height); * ed.WriteMessage("\n视图target:{0}", VR.Target); * ed.WriteMessage("\n视图宽度:{0}", VR.Width); * ed.WriteMessage("\n视图角度:{0}", VR.ViewTwist); * * ed.WriteMessage("\n图层状况{0}", VR.LayerState); * } */ int scale = 1; PromptIntegerOptions GetNumberOption = new PromptIntegerOptions("\n输入视口比例,默认为1"); GetNumberOption.AllowNegative = false; GetNumberOption.AllowZero = false; GetNumberOption.AllowNone = true; PromptIntegerResult GetNumberResult = ed.GetInteger(GetNumberOption); if (GetNumberResult.Status == PromptStatus.OK) { scale = GetNumberResult.Value; } for (int i = 0; i < Layoutlist.Count; i++) { if (i == viewlist.Count) { continue; } ViewTableRecord VR = viewlist[i] as ViewTableRecord; Viewport VP = SetViewport(VR, new Point2d(0, 0), scale); Layout LT = Layoutlist[i] as Layout; BlockTableRecord BTR = Trans.GetObject(LT.BlockTableRecordId, OpenMode.ForWrite) as BlockTableRecord; BTR.AppendEntity(VP); Trans.AddNewlyCreatedDBObject(VP, true); LayoutManager.Current.SetCurrentLayoutId(LT.Id); VP.On = true; //恢复视图的图层状态 layerState.RestoreLayerState(VR.LayerState, VP.Id, 1, LayerStateMasks.CurrentViewport); TypedValue[] Filter = new TypedValue[] { new TypedValue((int)DxfCode.Operator, "<and"), new TypedValue((int)DxfCode.LayoutName, LT.LayoutName), new TypedValue((int)DxfCode.LayerName, ClipLayerName), new TypedValue((int)DxfCode.Operator, "<or"), new TypedValue((int)DxfCode.Start, "POLYLINE"), new TypedValue((int)DxfCode.Start, "POLYLINE3D"), new TypedValue((int)DxfCode.Start, "POLYLINE2D"), new TypedValue((int)DxfCode.Start, "LWPOLYLINE"), new TypedValue((int)DxfCode.Operator, "or>"), new TypedValue((int)DxfCode.Operator, "and>") }; PromptSelectionResult selresult = ed.SelectAll(new SelectionFilter(Filter)); if (selresult.Status == PromptStatus.OK) { ObjectId[] IDs = selresult.Value.GetObjectIds(); VP.NonRectClipEntityId = IDs[0]; VP.NonRectClipOn = true; //ed.WriteMessage("\n呵呵,剪裁了视口哦"); } else { ed.WriteMessage("\n布局“{0}”中未找到裁剪视口的多义线!视口裁剪失败!", LT.LayoutName); } } Trans.Commit(); } catch (Autodesk.AutoCAD.Runtime.Exception Ex) { ed.WriteMessage("出错啦!{0}", Ex.ToString()); } finally { Trans.Dispose(); } } }
public void MyCommand() // This method can have any name { // Put your command code here Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; LayerStateManager layerState = db.LayerStateManager; string ClipLayerName = "TK-视口"; using (Transaction Trans = db.TransactionManager.StartTransaction()) { try { //获取布局列表(剔除模型空间) DBDictionary Layouts = Trans.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary; ArrayList Layoutlist = new ArrayList(); foreach (DBDictionaryEntry item in Layouts) { if (item.Key != "Model") { Layout layoutobject = Trans.GetObject(item.Value, OpenMode.ForRead) as Layout; Layoutlist.Add(layoutobject); } } //获取view列表,注意哦,是symbotable,不能用viewtable,会闪退 SymbolTable MyVt = Trans.GetObject(db.ViewTableId, OpenMode.ForRead) as SymbolTable; ArrayList viewlist = new ArrayList(); foreach (ObjectId viewID in MyVt) { ViewTableRecord VR = Trans.GetObject(viewID, OpenMode.ForRead) as ViewTableRecord; viewlist.Add(VR); } if (viewlist.Count == 0) { ed.WriteMessage("\n未发现存储的视图!"); return; } double scale = 1; PromptDoubleOptions GetNumberOption = new PromptDoubleOptions("\n输入视口比例,默认为1"); GetNumberOption.AllowNegative = false; GetNumberOption.AllowZero = false; GetNumberOption.AllowNone = true; PromptDoubleResult GetNumberResult = ed.GetDouble(GetNumberOption); if (GetNumberResult.Status == PromptStatus.OK) { scale = GetNumberResult.Value; } else { return; } for (int i = 0; i < Layoutlist.Count; i++) { if (i == viewlist.Count) { break; } Layout LT = Layoutlist[i] as Layout; string[] split = LT.LayoutName.Split(' '); Regex patten = new Regex(@"^0*\d{1,}"); Regex replace = new Regex("^0*"); string match = replace.Replace(split[0], ""); var query = from ViewTableRecord view in viewlist where replace.Replace(view.Name, "") == match select view; if (!query.Any()) { ed.WriteMessage("\n布局“{0}”未找到匹配的视图,没有成功生成视口!", LT.LayoutName); i--; continue; } ViewTableRecord VR = query.First(); Viewport VP = GetViewport(VR, new Point2d(0, 0), scale, false); BlockTableRecord BTR = Trans.GetObject(LT.BlockTableRecordId, OpenMode.ForWrite) as BlockTableRecord; BTR.AppendEntity(VP); Trans.AddNewlyCreatedDBObject(VP, true); LayoutManager.Current.SetCurrentLayoutId(LT.Id); VP.On = true; //恢复视图的图层状态 // ed.WriteMessage("\n<" + VR.LayerState + ">"); if (VR.LayerState != "") { layerState.RestoreLayerState(VR.LayerState, VP.Id, 1, LayerStateMasks.CurrentViewport); } //开始选择多段线裁剪视口 TypedValue[] Filter = new TypedValue[] { new TypedValue((int)DxfCode.Operator, "<and"), new TypedValue((int)DxfCode.LayoutName, LT.LayoutName), new TypedValue((int)DxfCode.LayerName, ClipLayerName), new TypedValue((int)DxfCode.Operator, "<or"), new TypedValue((int)DxfCode.Start, "POLYLINE"), new TypedValue((int)DxfCode.Start, "POLYLINE3D"), new TypedValue((int)DxfCode.Start, "POLYLINE2D"), new TypedValue((int)DxfCode.Start, "LWPOLYLINE"), new TypedValue((int)DxfCode.Operator, "or>"), new TypedValue((int)DxfCode.Operator, "and>") }; PromptSelectionResult selresult = ed.SelectAll(new SelectionFilter(Filter)); if (selresult.Status == PromptStatus.OK) { ObjectId[] IDs = selresult.Value.GetObjectIds(); VP.NonRectClipEntityId = IDs[0]; VP.NonRectClipOn = true; //ed.WriteMessage("\n呵呵,剪裁了视口哦"); } else { ed.WriteMessage("\n布局“{0}”中未找到裁剪视口的多义线!视口裁剪失败!", LT.LayoutName); } } Trans.Commit(); } catch (Autodesk.AutoCAD.Runtime.Exception Ex) { ed.WriteMessage("\n出错啦!{0}", Ex.ToString()); } finally { Trans.Dispose(); } } }
public void MyCommand() // This method can have any name { LayerStateManager LayerState = db.LayerStateManager; int viewnum = 0; ObjectId SaveTableID = InitialSave(); if (SaveTableID == ObjectId.Null) { ed.WriteMessage("\n遇到问题,无法创建存档..."); return; } int SaveNum = GetSave(SaveTableID); if (SaveNum != InitialNum) { PromptIntegerOptions InputOption = new PromptIntegerOptions("\n回车继续上次的编号,或者输入新的视图起始编号"); InputOption.AllowNone = true; InputOption.DefaultValue = SaveNum; PromptIntegerResult InputRes = ed.GetInteger(InputOption); if (InputRes.Status != PromptStatus.OK) { return; } viewnum = InputRes.Value; } else { PromptIntegerResult numres = ed.GetInteger("\n输入视图起始编号"); if (numres.Status != PromptStatus.OK) { return; } viewnum = numres.Value; } int counter = 0; while (true) { inputstart: PromptEntityOptions ops = new PromptEntityOptions("\n选择视图框"); ops.SetRejectMessage("\n只能选择封闭的矩形!"); ops.AddAllowedClass(typeof(Polyline), true); ops.AllowNone = false; ops.AllowObjectOnLockedLayer = true; PromptEntityResult res = ed.GetEntity(ops); if (res.Status != PromptStatus.OK) { if (counter != 0) { UpdateSave(SaveTableID, viewnum); } ed.WriteMessage("\n共创建{0}个视图。", counter); break; } using (Transaction trans = db.TransactionManager.StartTransaction()) { try { Polyline PL = trans.GetObject(res.ObjectId, OpenMode.ForRead) as Polyline; if (PL.NumberOfVertices != 4 && !PL.Closed) { ed.WriteMessage("\n选择的不是封闭的矩形!"); goto inputstart; } Point3d P1 = PL.GetPoint3dAt(0); Point3d P2 = PL.GetPoint3dAt(1); Point3d P3 = PL.GetPoint3dAt(2); Point3d P4 = PL.GetPoint3dAt(3); Vector3d V1 = P1.GetVectorTo(P2); Vector3d V2 = P2.GetVectorTo(P3); Vector3d V3 = P3.GetVectorTo(P4); Vector3d V4 = P4.GetVectorTo(P1); if (!(V1.IsPerpendicularTo(V2) && V2.IsPerpendicularTo(V3) && V3.IsPerpendicularTo(V4))) { ed.WriteMessage("\n选择的不是封闭的矩形!"); goto inputstart; } Point2d CT = new Point2d((P1.X + P3.X) / 2, (P1.Y + P3.Y) / 2); double H = 1; double W = 1; if (V1.Length > V4.Length) { H = V4.Length; W = V1.Length; } else { H = V1.Length; W = V4.Length; } Vector2d UserXaxix = new Vector2d(db.Ucsxdir.X, db.Ucsxdir.Y); Vector2d WXaxix = new Vector2d(1, 0); double TwistAngle = WXaxix.GetAngleTo(UserXaxix); if (db.Ucsxdir.Y > 0) { TwistAngle = Math.PI * 2 - WXaxix.GetAngleTo(UserXaxix); } //Matrix2d WCS2DCS = Matrix2d.Rotation(new Vector2d(1, 0).GetAngleTo(UserXaxix),new Point2d(0,0)); Matrix2d WCS2DCS = Matrix2d.Rotation(TwistAngle, new Point2d(0, 0)); Point3d UcsCenter = db.Ucsorg; //Point2d DcsCenter = new Point2d(UcsCenter.X, UcsCenter.Y).TransformBy(TransWCSToDCS); Point2d DcsCenter = CT.TransformBy(WCS2DCS); /* * ed.WriteMessage("\n计算旋转角:{0}", WXaxix.GetAngleTo(UserXaxix)); * ed.WriteMessage("\nTwistAngle:{0}", TwistAngle); * ed.WriteMessage("\nWCS的中点:{0}", CT.ToString()); * ed.WriteMessage("\nUCS的中点:{0}", new Point3d(CT.X,CT.Y,0).TransformBy(ed.CurrentUserCoordinateSystem).ToString()); * ed.WriteMessage("\nDCS的中点:{0}", DcsCenter.ToString()); */ SymbolTable VT = trans.GetObject(db.ViewTableId, OpenMode.ForWrite) as SymbolTable; if (VT.Has(viewnum.ToString())) { foreach (ObjectId viewid in VT) { ViewTableRecord VR = trans.GetObject(viewid, OpenMode.ForWrite) as ViewTableRecord; if (VR.Name == viewnum.ToString()) { VR.Erase(); break; } } } ViewTableRecord NewVr = new ViewTableRecord(); NewVr.Name = viewnum.ToString(); NewVr.CenterPoint = DcsCenter; NewVr.Height = H; NewVr.Width = W; NewVr.ViewTwist = TwistAngle; NewVr.SetUcs(db.Ucsorg, db.Ucsxdir, db.Ucsydir); VT.Add(NewVr); trans.AddNewlyCreatedDBObject(NewVr, true); //添加图层快照属性要在把view添加到数据库里后再操作,要不会报错eNoDataBase... string LayerStateName = string.Format("ACAD_VIEWS_{0}", NewVr.Name); //已有同名那就删掉 if (LayerState.HasLayerState(LayerStateName)) { LayerState.DeleteLayerState(LayerStateName); } LayerState.SaveLayerState(LayerStateName, LayerStateMasks.None, new ObjectId()); NewVr.LayerState = LayerStateName; trans.Commit(); ed.WriteMessage("\n成功创建编号为{0}的视图。", viewnum); viewnum++; counter++; } catch (Autodesk.AutoCAD.Runtime.Exception EX) { ed.WriteMessage("\n出错了!{0}", EX.ToString()); } finally { trans.Dispose(); } } } }