国产篇 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测试,
即使不设置这个参数也是有一点几率发生鼠标跳动,
只是设置了更容易看见这个问题,并且会产生停留.
#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呢?
注册表
a106
这里浩辰读出来是空字符串
string KEY = HostApplicationServices.Current.RegistryProductRootKey;
a107
NET4.0及以上工程获取注册表会出现以下问题,
而NET3.5是没有问题.
要将代码改成以下获取:
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
(未完待续)