1 Thêm class MyCommands.cs
Lưu mã sau dưới dạng tệp tin MyCommands.cs
Code:
// (C) Copyright 2024 by // using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using System.Collections.Generic; // This line is not mandatory, but improves loading performances [assembly: CommandClass(typeof(AJS_InsertBlockReference_EntityJig.MyCommands))] namespace AJS_InsertBlockReference_EntityJig { public class MyCommands { // Modal Command with localized name [CommandMethod("AJS_InsertBlock", CommandFlags.Modal)] public void Command_AJS_InsertBlock() // This method can have any name { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; Editor ed = doc.Editor; Database db = doc.Database; ed.WriteMessage("\nInsertBlockReference Jig - Edited by www.lisp.vn"); using (var tr = db.TransactionManager.StartTransaction()) { var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; int n = 1; Dictionary<int, ObjectId> btrs = new Dictionary<int, ObjectId>(); ed.WriteMessage("\nSelect order of a block list: "); foreach (var id in bt) { var btr = tr.GetObject(id, OpenMode.ForRead) as BlockTableRecord; if (btr == null || btr.IsLayout || btr.IsAnonymous || string.IsNullOrEmpty(btr.Name)) continue; btrs.Add(n, id); ed.WriteMessage("\n" + n++ + "." + btr.Name); } PromptIntegerOptions pio = new PromptIntegerOptions("\nSpecify block order (from 1 to " + (n - 1) + ")"); pio.AllowNegative = false; pio.AllowNone = false; var pir = ed.GetInteger(pio); if (pir.Status != PromptStatus.OK) return; if (pir.Value >= 1 && btrs.ContainsKey(pir.Value)) { var br = new BlockReference(Point3d.Origin, btrs[pir.Value]); if (br != null) { if (BlockMovingRotating.Jig(br)) { var btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord; btr.AppendEntity(br); tr.AddNewlyCreatedDBObject(br, true); var blockdef = tr.GetObject(br.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord; foreach (var atid in blockdef) { var attDef = tr.GetObject(atid, OpenMode.ForRead) as AttributeDefinition; if (attDef != null && !attDef.Constant) { var atr = new AttributeReference(); atr.SetAttributeFromBlock(attDef, br.BlockTransform); atr.TextString = atr.getTextWithFieldCodes().Replace("?BlockRefId", "%<\\_ObjId " + br.ObjectId.OldIdPtr.ToString() + ">%"); br.AttributeCollection.AppendAttribute(atr); tr.AddNewlyCreatedDBObject(atr, true); } } } } } tr.Commit(); } ed.WriteMessage("\nInsertBlockReference Jig - Edited by www.lisp.vn"); } } }
2 Thêm class BlockMovingRotating.cs
Lưu mã sau dưới dạng tệp tin BlockMovingRotating.lsp
Code:
using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; namespace AJS_InsertBlockReference_EntityJig { public class BlockMovingRotating : EntityJig { #region Fields public int mCurJigFactorNumber = 1; private Point3d mPosition; // Factor #1 private double mRotation; // Factor #2 #endregion Fields #region Constructors public BlockMovingRotating(Entity ent) : base(ent) { } #endregion Constructors #region Overrides protected override bool Update() { switch (mCurJigFactorNumber) { case 1: (Entity as BlockReference).Position = mPosition; break; case 2: (Entity as BlockReference).Rotation = mRotation; break; default: return false; } return true; } protected override SamplerStatus Sampler(JigPrompts prompts) { switch (mCurJigFactorNumber) { case 1: JigPromptPointOptions prOptions1 = new JigPromptPointOptions("\nBlock position:"); PromptPointResult prResult1 = prompts.AcquirePoint(prOptions1); if (prResult1.Status == PromptStatus.Cancel) return SamplerStatus.Cancel; if (prResult1.Value.Equals(mPosition)) { return SamplerStatus.NoChange; } else { mPosition = prResult1.Value; return SamplerStatus.OK; } case 2: JigPromptAngleOptions prOptions2 = new JigPromptAngleOptions("\nBlock rotation angle:"); prOptions2.BasePoint = (Entity as BlockReference).Position; prOptions2.UseBasePoint = true; PromptDoubleResult prResult2 = prompts.AcquireAngle(prOptions2); if (prResult2.Status == PromptStatus.Cancel) return SamplerStatus.Cancel; if (prResult2.Value.Equals(mRotation)) { return SamplerStatus.NoChange; } else { mRotation = prResult2.Value; return SamplerStatus.OK; } default: break; } return SamplerStatus.OK; } #endregion Overrides #region Method to Call public static bool Jig(BlockReference ent) { try { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; BlockMovingRotating jigger = new BlockMovingRotating(ent); PromptResult pr; do { pr = ed.Drag(jigger); } while (pr.Status != PromptStatus.Cancel && pr.Status != PromptStatus.Error && pr.Status != PromptStatus.Keyword && jigger.mCurJigFactorNumber++ <= 2); return pr.Status == PromptStatus.OK; } catch { return false; } } #endregion Method to Call } }
Nguồn tham khảo
---------------------------------------------------------------------------------------------
Mọi thông tin xin liên hệ Fanpage AutoLISP Thật là đơn giản!
Cảm ơn bạn đã theo dõi!
Không có nhận xét nào:
Đăng nhận xét