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