国产篇 cad问题小百科_Gcad

浩辰GCAD

一些桌子的问题移步去: cad问题小百科_Acad
浩辰和桌子具有相同的问题,所以建议你也去看.

若大家对以下问题有更好的解决方案,
可以评论中用#20071编号的进行评论,以便更好沟通~

命名空间区分,
建议参考gitee的IFoxCAD项目,
不同net版本用同一个.csproj,
不同cad分成不同项目:桌子/浩辰/中望.
用全局命名空间,而不是用预处理符号区分.

#if !HC2019
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.DatabaseServices.Filters;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.GraphicsInterface;
#else
using GrxCAD.DatabaseServices;
using GrxCAD.EditorInput;
using GrxCAD.Geometry;
using GrxCAD.ApplicationServices;
using GrxCAD.Runtime;
using GrxCAD.Colors;
using GrxCAD.GraphicsInterface;
#endif
using System.Collections.Generic;
using System.Linq;

#101 命令执行优先级

系统变量: autocompletemode,19
原因是"输入按键时显示建议列表"这个项打钩了,
这里首先捕捉的是lisp定义的命令,而不是pgp.

#102 鼠标跳动

系统变量: Dynmode,0
动态输入,这个参数将导致zoom缩放的时候,鼠标会发生跳动,并有一定几率停留在边界.

一定要多用zoom测试,
即使不设置这个参数也是有一点几率发生鼠标跳动,
只是设置了更容易看见这个问题,并且会产生停留.
img

#103 选择集参数有误

gcad2019已经解决

// 定义选择集选项
PromptSelectionOptions pso = new ()  { 
    // 不需要空格确认,但是浩辰会变成鼠标单框
    // SingleOnly = true,
    // 真正的鼠标单框
    SelectEverythingInAperture = true,
};
public class GcadTestClass  {
    //请先先用gcad测试test1和test2,可以看到两段代码的作用是一样的.
    //然后再用acad测试test1和test2,可以看到test2中的SingleOnly的作用.
     
    // SingleOnly = true 作用应该是"选择了图元后不需要空格确认"立马成为一个选择集,而不是成为一个鼠标单选框.
    // SelectEverythingInAperture = true, 真正鼠标单框.
         
    [CommandMethod(nameof(Test1), CommandFlags.Modal | CommandFlags.UsePickSet)]
    public void Test1()   {
        var doc = Application.DocumentManager.MdiActiveDocument;
        var db = doc.Databse;
        var ed = doc.Editor;
           
        //定义选择集选项
        PromptSelectionOptions pso = new () {
            AllowDuplicates = false,  //重复选择
            // SingleOnly = true,        //不需要空格确认,但是浩辰会变成单选
            SelectEverythingInAperture = true,   //鼠标单框
        };  
        var ssPsr = ed.GetSelection(pso);
        if (ssPsr.Status != PromptStatus.OK) return;

        using var tr = db.TransactionManager.StartTransaction();
        foreach (var id in ssPsr.Value.GetObjectIds()) {
            using var ent = (Entity)id.GetObject(OpenMode.ForRead);
            ent.Highlight();
        } 
        tr.Commit();
    } 

    [CommandMethod(nameof(Test2), CommandFlags.Modal | CommandFlags.UsePickSet)]
    public void Test2() {
        var doc = Application.DocumentManager.MdiActiveDocument;
        var db = doc.Databse;
        var ed = doc.Editor;
 
        // 定义选择集选项
        PromptSelectionOptions pso = new() {
            AllowDuplicates = false,  // 重复选择
            SingleOnly = true, // 不需要空格确认,但是浩辰会变成单选
            // SelectEverythingInAperture = true,   //鼠标单框
        };
        var ssPsr = ed.GetSelection(pso);
        if (ssPsr.Status != PromptStatus.OK) return; 

        using var tr = db.TransactionManager.StartTransaction();
        foreach (var id in ssPsr.Value.GetObjectIds()) {
            using var ent = (Entity)id.GetObject(OpenMode.ForRead);
            ent.Highlight();
        }
        tr.Commit();
    }
}

#104 组块问题

将导致图元出现不可选择的问题..
这里是一个很严重的问题,
我的习惯是先生成图元到内存中,
然后进行矩阵移动,最后再添加到数据库内.

acad是允许这样操作的,这样操作也很符合常规思维,
如果不能修复这个问题,
那么将要先计算好再生成或者先生成到数据库再进行矩阵变换,
前者编程思维要改变,代码改动很大,后者用户操作时候会发生卡顿等.

public class GcadTestClass {
    [CommandMethod(nameof(Test3), CommandFlags.Modal | CommandFlags.DocExclusiveLock)]
    public void Test3() {
        var doc = Application.DocumentManager.MdiActiveDocument;
        var db = doc.Databse;
        var ed = doc.Editor;

        var ppo1 = new PromptPointOptions("\n指定第一点:");
        var ppr1 = ed.GetPoint(ppo1);             
        if (ppr1.Status != PromptStatus.OK) return;

        var ppo2 = new PromptPointOptions("\n指定另一点:") {
            UseBasePoint = true,
            BasePoint = ppr1.Value
        };
        var ppr2 = ed.GetPoint(ppo2);//用户点选             
        if (ppr2.Status != PromptStatus.OK)
            return;
 
        // 生成xline
        using var tr = db.TransactionManager.StartTransaction();
        using var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
        var line = new Line {
            StartPoint = ppr1.Value,
            EndPoint = ppr2.Value,
        };

        // 添加一个新的块表记录,这个记录将存放块参照的所有图元
        var btrNew = new BlockTableRecord { Name = "test", Origin = line.StartPoint };
        btrNew.AppendEntity(line);
        bt.Add(btrNew);
        tr.AddNewlyCreatedDBObject(btrNew, true);  

         // 新建块参照加入到当前空间
        var br = new BlockReference(line.StartPoint, btrNew.ObjectId)  {
            ScaleFactors = new Scale3d()
        };

        // 当前空间的块表记录
        using var btrCu = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
        var brId = btrCu.AppendEntity(br);  //加入块表记录

        // ※※ 这句如果在变形之后,将导致浩辰不可以选择块
        // ※※ tr.AddNewlyCreatedDBObject(br, true);

        // 计算变换矩阵 
        Matrix3d mt = Matrix3d.Rotation(Math.PI, Vector3d.ZAxis, line.StartPoint);
        using var ent = (Entity)tr.GetObject(brId, OpenMode.ForWrite);
        ent.TransformBy(mt);

        tr.AddNewlyCreatedDBObject(br, true);    //这句如果在变形之后,将导致浩辰不可以选择块

        btrCu.DowngradeOpen();
        br.DowngradeOpen();
        tr.Commit();
    }
}

#105 新建文字样式

gcad与acad在这个地方不同的是新建文字样式的时候如果用到.TTF字体,
直接写字体名称就好了,不能够写新宋体.TTF
不然浩辰出现以下情况:

看上去是乱码的一坨东西,和文字样式面板的字体名多了个.TTF.SHX(X)

而acad需要写".TTF"后缀名,那么此时是不是没有区分shx和ttf呢?
img
img

注册表

a106

这里浩辰读出来是空字符串

string KEY = HostApplicationServices.Current.RegistryProductRootKey; 

a107

NET4.0及以上工程获取注册表会出现以下问题,
而NET3.5是没有问题.
img

要将代码改成以下获取:

var copys = Registry.CurrentUser.OpenSubKey(@"Software\\Gstarsoft\\GstarCAD\\R19\\zh-CN\\");
var b = copys.GetValueNames();
foreach (var item in b){
     string sz = copys.GetValue(item).ToString();
     sz = sz.Remove(sz.IndexOf('\0'));
     Console.WriteLine(sz);
} 

#108 关于浩辰的环境变量获取

https://www.cnblogs.com/JJBox/p/10209541.html

(未完待续)

posted @ 2019-01-02 17:21  惊惊  阅读(1501)  评论(0编辑  收藏  举报