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
}
posted @ 2025-04-18 14:58  惊惊  阅读(220)  评论(10)    收藏  举报