cad.net 天正
天正
namespace JoinBox;
public class Tch {
// 天正多行文字
[DllImport("tch_kernal.arx", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?GetText@TDbText@@QEBAPEB_WXZ")]
private static extern IntPtr GetText_Native(IntPtr tchElev);
[CommandMethod(nameof(Tz_mtext1))]
public static void Tz_mtext1() {
using var tr = new DBTrans();
var entRes = Env.Editor.GetEntity("选择天正文字: \n");
if (entRes.Status != PromptStatus.OK)
return;
// 获取选中的实体对象
using var ent = tr.GetObject<Entity>(entRes.ObjectId);
// 调用非托管方法获取文本内容的指针
IntPtr nativeText = GetText_Native(unmanagedPtr);
// 如果文本内容的指针不为空,则将其转换为字符串并输出
if (nativeText == IntPtr.Zero) return;
string text = Marshal.PtrToStringUni(nativeText);
if (text is not null)
Env.Print(text);
}
}
// 下面这个其实是和Lisp接口一样原理
// 相关函数 https://www.cnblogs.com/JJBox/p/12426728.html
[CommandMethod(nameof(Tz_mtext2))]
public void Tz_mtext2() {
var promptEntity = Env.Editor.GetEntity("\n选择天正文字图元:");
if (promptEntity.Status != PromptStatus.OK)
return;
// 事务栈,可以博客里面搜,也可以用IFox的.
using DBTrans tr = new();
var rb = new ResultBuffer();
AcdbAdsHelper.AcdbGetAdsName(out AdsName eName, promptEntity.ObjectId);
var getx = AcdbAdsHelper.AcdbEntGetX(ref eName, rb.UnmanagedObject);
if (getx == IntPtr.Zero) return;
foreach (TypedValue data in rb) {
if (data.TypeCode == 1)
Env.Editor.WriteMessage(data.Value.ToString());
}
}
// 天正单行文字修改
[DllImport("tch_kernal.arx", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?SetText@TDbSymbElevation@@QEAAXPEB_W@Z")]
static extern void TDbSymbSetText(IntPtr tchElev, string txtHigth);
[CommandMethod(nameof(Tz_dbText))]
public void Tz_dbText() {
var entRes = Env.Editor.GetEntity("\n选择天正单行文字:");
if (entRes.Status != PromptStatus.OK)
return;
using DBTrans tr = new();
using var ent = (Entity)tr.GetObject(entRes.ObjectId, OpenMode.ForRead);
dynamic dy = ent.AcadObject;
Env.Printl($"天正文字内容: {dy.Text}");
TDbSymbSetText(ent.UnmanagedObject, "3.5");
}
// 天正引线
[DllImport("tch_kernal.arx", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?GetText1@TDbSymbMultiLeader@@QEBAPEB_WXZ")]
static extern string GetText1(IntPtr tchElev);
[CommandMethod(nameof(Tz_Le))]
public void Tz_Le() {
var entRes = Env.Editor.GetEntity("\n选择天正引线:");
if (entRes.Status != PromptStatus.OK)
return;
using DBTrans tr = new();
using var ent = (Entity)tr.GetObject(entRes.ObjectId, OpenMode.ForRead)
var text = GetText1(ent.UnmanagedObject);
ed.WriteMessage(text);
}
// 天正转旧T3,测试环境是t20v8
[DllImport("tch_kernal.arx", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?SaveAsTArch3@@YAHPEAVAcDbDatabase@@PEB_WH_N@Z")]
public static extern int SaveAsTArch3(IntPtr db,
[MarshalAs(UnmanagedType.BStr)] string path,
int param1, bool param2);
[CommandMethod(nameof(Tz_t3))]
public void Tz_t3() {
var doc = Acap.DocumentManager.MdiActiveDocument;
var outputFile = doc.Database.Filename;
// 文件存在,后缀加一个 "_t3"
if (File.Exists(outputFile)) {
var directory = Path.GetDirectoryName(outputFile);
var fileName = Path.GetFileNameWithoutExtension(outputFile);
var extension = Path.GetExtension(outputFile);
outputFile = Path.Combine(directory, $"{fileName}_t3{extension}");
}
// 直接读取当前DWG文件版本
// https://www.cnblogs.com/JJBox/p/18511807
var dwgver = ...
var progId = dwgver == DwgVersion.Current
? DwgVersionEx.GetProgId(db.OriginalFileVersion)
: DwgVersionEx.GetProgId(dwgver);
SaveAsTArch3(db.UnmanagedObject, outputFile, progId, false);
}
}
青蛙补充
不如用我的定点数表示法:
https://www.cnblogs.com/JJBox/p/18511807
public static short GetProgId(DwgVersion ver) {
var id = EnumEx.GetEnumAtt<ACadVerDescription>( GerCadVer(ver))?.Rid;
return id == ReleaseId.Unknown ? (short)0 : short.Parse(id.ToString().Substring(1, 2));
}
public static class EnumEx {
public static TAttribute? GetEnumAtt<TAttribute>(Enum en) where TAttribute : Attribute {
var enummType = en.GetType();
var memberInfos = enummType.GetMember(en.ToString());
if (memberInfos.Length <= 0) return null;
var objs = memberInfos[0].GetCustomAttributes(typeof(TAttribute), false);
if (objs.Length > 0) return (TAttribute)objs[0];
return null;
}
public static string? GetEnumDescription(Enum en) {
return GetEnumAtt<DescriptionAttribute>(en)?.Description;
}
}
// TODO: 出新版本后,版本信息需更新
public enum CadVer {
[ACadVerDescription("AutoCAD 2000", DwgAc.Ac1015, ReleaseId.R150)]
AutoCad2000,
[ACadVerDescription("AutoCAD 2004", DwgAc.Ac1800, ReleaseId.R160)]
AutoCad2004,
[ACadVerDescription("AutoCAD 2005", DwgAc.Ac1800, ReleaseId.R161)]
AutoCad2005,
[ACadVerDescription("AutoCAD 2006", DwgAc.Ac1800, ReleaseId.R162)]
AutoCad2006,
[ACadVerDescription("AutoCAD 2007", DwgAc.Ac1021, ReleaseId.R170)]
AutoCad2007,
[ACadVerDescription("AutoCAD 2008", DwgAc.Ac1021, ReleaseId.R171)]
AutoCad2008,
[ACadVerDescription("AutoCAD 2009", DwgAc.Ac1021, ReleaseId.R172)]
AutoCad2009,
[ACadVerDescription("AutoCAD 2010", DwgAc.Ac1024, ReleaseId.R180)]
AutoCad2010,
[ACadVerDescription("AutoCAD 2011", DwgAc.Ac1024, ReleaseId.R181)]
AutoCad2011,
[ACadVerDescription("AutoCAD 2012", DwgAc.Ac1024, ReleaseId.R182)]
AutoCad2012,
[ACadVerDescription("AutoCAD 2013", DwgAc.Ac1027, ReleaseId.R190)]
AutoCad2013,
[ACadVerDescription("AutoCAD 2014", DwgAc.Ac1027, ReleaseId.R191)]
AutoCad2014,
[ACadVerDescription("AutoCAD 2015", DwgAc.Ac1027, ReleaseId.R200)]
AutoCad2015,
[ACadVerDescription("AutoCAD 2016", DwgAc.Ac1027, ReleaseId.R201)]
AutoCad2016,
[ACadVerDescription("AutoCAD 2017", DwgAc.Ac1027, ReleaseId.R210)]
AutoCad2017,
[ACadVerDescription("AutoCAD 2018", DwgAc.Ac1032, ReleaseId.R220)]
AutoCad2018,
[ACadVerDescription("AutoCAD 2019", DwgAc.Ac1032, ReleaseId.R230)]
AutoCad2019,
[ACadVerDescription("AutoCAD 2020", DwgAc.Ac1032, ReleaseId.R231)]
AutoCad2020,
[ACadVerDescription("AutoCAD 2021", DwgAc.Ac1032, ReleaseId.R240)]
AutoCad2021,
[ACadVerDescription("AutoCAD 2022", DwgAc.Ac1032, ReleaseId.R241)]
AutoCad2022,
[ACadVerDescription("AutoCAD 2023", DwgAc.Ac1032, ReleaseId.R242)]
AutoCad2023,
[ACadVerDescription("AutoCAD 2024", DwgAc.Ac1032, ReleaseId.R243)]
AutoCad2024,
[ACadVerDescription("AutoCAD 2025", DwgAc.Ac1032, ReleaseId.R250)]
AutoCad2025,
[ACadVerDescription("未知版本", DwgAc.Unknown, ReleaseId.Unknown)]
Unknown,
}
public enum DwgAc {
Ac1015,
Ac1800,
Ac1021,
Ac1024,
Ac1027,
Ac1032,
AcNewest,
Unknown,
CorruptFile
}
public enum ReleaseId
{
R150,
R160,
R161,
R162,
R170,
R171,
R172,
R180,
R181,
R182,
R190,
R191,
R200,
R201,
R210,
R220,
R230,
R231,
R240,
R241,
R242,
R243,
R250,
Unknown
}
public enum ReleaseBigId
{
R16,
R17,
R18,
R19,
R20,
R21,
R22,
R23,
R24,
R25,
Unknown
}