国产篇 cad问题小百科_Gcad

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

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

 

#101 命令执行优先级

系统变量: autocompletemode,19

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

 

#102 鼠标跳动

系统变量: Dynmode,0

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

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

 

#103 gcad.net选择集参数有误.

gcad2019已经解决

//定义选择集选项
      PromptSelectionOptions pso = new PromptSelectionOptions
      { 
          // SingleOnly = true,                //不需要空格确认,但是浩辰会变成鼠标单框
          SelectEverythingInAperture = true,   //鼠标单框
      };
#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;

namespace JJBoxGstarCad_2019
{
    public static class Test
    {
        //请先先用gcad测试test1和test2,可以看到两段代码的作用是一样的.
        //然后再用acad测试test1和test2,可以看到test2中的SingleOnly的作用.
     
        // SingleOnly = true的作用应该是"选择了图元后不需要空格确认"立马成为一个选择集,而不是成为一个鼠标单选框.
        // SelectEverythingInAperture = true,为鼠标单框.
         
        [CommandMethod("test1", CommandFlags.Modal | CommandFlags.UsePickSet)]
        public static void Test1()
        {
            Database db = HostApplicationServices.WorkingDatabase;//当前的数据库
            DocumentCollection doc = Application.DocumentManager;
            Editor ed = doc.MdiActiveDocument.Editor;
           
            //定义选择集选项
            PromptSelectionOptions pso = new PromptSelectionOptions
            {
                AllowDuplicates = false,  //重复选择
               // SingleOnly = true,        //不需要空格确认,但是浩辰会变成单选
                SelectEverythingInAperture = true,   //鼠标单框
            };  
            var ssPsr = ed.GetSelection(pso);
            if (ssPsr.Status != PromptStatus.OK) return;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                foreach (var id in ssPsr.Value.GetObjectIds())//遍历选择集亮显测试用
                {
                    var ent = (Entity)id.GetObject(OpenMode.ForRead);
                    ent.Highlight();
                } 
                tr.Commit();
            } 
        }

        [CommandMethod("test2", CommandFlags.Modal | CommandFlags.UsePickSet)]
        public static void Test2()
        {
            Database db = HostApplicationServices.WorkingDatabase;//当前的数据库
            DocumentCollection doc = Application.DocumentManager;
            Editor ed = doc.MdiActiveDocument.Editor;
 
            //定义选择集选项
            PromptSelectionOptions pso = new PromptSelectionOptions
            {
                AllowDuplicates = false,  //重复选择
                SingleOnly = true,        //不需要空格确认,但是浩辰会变成单选
               // SelectEverythingInAperture = true,   //鼠标单框
            };
            var ssPsr = ed.GetSelection(pso);
            if (ssPsr.Status != PromptStatus.OK) return; 
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                foreach (var id in ssPsr.Value.GetObjectIds())//遍历选择集亮显测试用
                {
                    var ent = (Entity)id.GetObject(OpenMode.ForRead);
                    ent.Highlight();
                }
                tr.Commit();
            }
        } 
    }
}
View Code

 

#104 gcad.net组块问题

将导致图元出现不可选择的问题..

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

acad是允许这样操作的,这样操作也很符合常规思维,

如果不能修复这个问题,那么将要先计算好再生成或者先生成到数据库再进行矩阵变换,

前者编程思维要改变,代码改动很大,后者用户操作时候会发生卡顿等.

#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;
#else
using GrxCAD.DatabaseServices;
using GrxCAD.EditorInput;
using GrxCAD.Geometry;
using GrxCAD.ApplicationServices;
using GrxCAD.Runtime;
#endif
using System;
using static JingJingBoxDD.CadSystem;



public class Command_jjline
{
    [CommandMethod("LL", CommandFlags.Modal | CommandFlags.DocExclusiveLock)]
    public static void LL()
    {
        Database db = HostApplicationServices.WorkingDatabase;//当前的数据库
        Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

        try
        {
            PromptPointOptions ppo1 = new PromptPointOptions("\n指定第一点:");
            PromptPointResult ppr1 = ed.GetPoint(ppo1);//用户点选             
            if (ppr1.Status != PromptStatus.OK)
            {
                return;
            }

            PromptPointOptions ppo2 = new PromptPointOptions("\n指定另一点:")
            {
                UseBasePoint = true,
                BasePoint = ppr1.Value
            };
            PromptPointResult ppr2 = ed.GetPoint(ppo2);//用户点选             
            if (ppr2.Status != PromptStatus.OK)
            {
                return;
            }

            //生成xline
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                //块表
                BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
                Line line = new Line
                {
                    StartPoint = ppr1.Value,
                    EndPoint = ppr2.Value,
                };
                //添加一个新的块表记录,这个记录将存放块参照的所有图元
                BlockTableRecord btrNew = new BlockTableRecord { Name = "test", Origin = line.StartPoint };
                btrNew.AppendEntity(line);
                bt.Add(btrNew);
                tr.AddNewlyCreatedDBObject(btrNew, true);//添加新创建的数据库对象  


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

                //当前空间的块表记录
                BlockTableRecord 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);
                Entity ent = (Entity)brId.GetObject(OpenMode.ForWrite);
                ent.TransformBy(mt);

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

                btrCu.DowngradeOpen();
                br.DowngradeOpen();
                tr.Commit();
            }
        }
        catch (System.Exception e)
        {
            ed.WriteMessage(e.Message);
            throw e;
        }
    }
}
View Code

 

#105 gcad.net新建文字样式

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

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

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

 

#106 gcad.net注册表

string KEY = HostApplicationServices.Current.RegistryProductRootKey; //这里浩辰读出来是空字符串

 

#107 gcad.net注册表

在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

 

 

 

(完)

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