今天一早上看了群里有小伙伴有这样的需求,是实现用户用鼠标点击拾取AutoCAD平面,拾取点然后作为插入编号文字位置,按住esc键后,退出自动编号。按照他的需求,我这里大致想了一下,如果按照该小伙伴提出的用多线程和委托,想必有点复杂了。首先AutoCAD是不支持多线程的,至于使用委托,我想大概意思是使用鼠标的点击事件回调而已。还有他另外提到的使用钩子,这估计就更复杂了。我做了一个简单的实现,使用的while循环,然后拾取屏幕上面的点,插入编号的文字即可。至于设置文字的样式什么,可以按照需求进行调整。这里参考了AutoCAD二次开发(.Net)之设置MText字体(1)这篇博客进行修改。具体实现效果如下图所示

今天是国庆的最后一天了,有点时间,来学习一下AutoCAD关于线型方面的内容。很多关于AutoCAD开发插件都会或多或少的涉及到线型方面的内容。线型存放在AutoCAD线型表中,线型表是AutoCAD几个组成表之一。首先这里去线型表里面找是否有我们对应名字的表,如果没有,来创建我们需要的线型样式。具体的线型样式,可以参考代码里面的注释,样式内容对应着线型表记录属性,设置相应的值即可。AutoCAD中对图形见面的实体线型类型可以通过LineTypeId来设置。经过测试,遇到了一个问题。在创建新的线型时,线型名称(Name)不能设置为空的字符串,否则AutoCAD运行后会报空错误。

这里创建好新的线型后,我们创建了多段线、圆两种实体分别用于展现我们创建新的创建线型。最终的效果如下图所示。

这次我们先做了一个测试工具,其主要目的是利用toolbox工具箱的Mosaic To New Raster

这次我们先做了一个测试工具,其主要目的是利用toolbox工具箱的Mosaic To New Raster

将多个栅格数据合成一个栅格数据。如果说栅格数量少的话,手动选择并没有太大的影响。而如果栅格文件非常多的话,手动选择将浪费大量的时间和精力,为此我们写了一个小工具,将某个目录下所有的栅格数据一次性加入到上面的Mosaic To New Raster工具中,直接运行即可。说得直接一点就是直接调用了Mosaic To New Raster工具,一次性加入多个文件。在写完这个工具后遇到工具打包和工具多个参数类型问题,现将自己写这部分功能中遇到的问题特记录下来。

利用python调用arcpy脚本后,如果使用代码的方式让用户使用编写的脚本是极其的不方便和友好。为此,需要利用某种方式将写好的脚本代码封装成类似arcgis中工具箱的工具。将写好的代码的目录利用catalog将其添加到arcgis中,然后在arcgis中选择该目录,右击选择【New】、选择【Python ToolBox】。这样在该目录下就生成了Toolbox.pyt文件。具体操

具体实现代码如下所示。

using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.EditorInput;using Autodesk.AutoCAD.Geometry;using Autodesk.AutoCAD.Runtime;using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace OrderAuto{    public class Class1    {        public int orderIndex = 1;        [CommandMethod("zdbh")]        public void demo() {            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;            Database db = doc.Database;            Editor ed = doc.Editor;            while (true)            {                Transaction trans = db.TransactionManager.StartTransaction();                using (trans)                {                    BlockTable blockTbl = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;                    BlockTableRecord modelSpace = trans.GetObject(blockTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;                    MText mt = new MText();                    mt.Contents = Convert.ToString(orderIndex);                    PromptPointResult ppr = ed.GetPoint("\n指点编号的插入点: ");                    Point3d location;                    if (ppr.Status!=PromptStatus.OK)                    {                        return;                    }else{                        location = ppr.Value;                    }                    DBText acText = new DBText();                    acText.Position = location;                    acText.Height = 50;                    acText.TextString = Convert.ToString(orderIndex);                    modelSpace.AppendEntity(acText);                    trans.AddNewlyCreatedDBObject(acText, true);                    /*                    mt.TextStyleId = AddTextStyle("宋体", "1", "3", 20, 20);                    mt.Width = 50;                    mt.Height = 50;                    mt.Location = location;                    modelSpace.AppendEntity(mt);                    trans.AddNewlyCreatedDBObject(mt, true);*/                    trans.Commit();                    orderIndex++;                }            }        }        public static ObjectId AddTextStyle(string name, string smallfont, string bigfont, double height, double xscale)        {            Database dbH = HostApplicationServices.WorkingDatabase;            using (Transaction trans = dbH.TransactionManager.StartTransaction())            {                TextStyleTable TST = (TextStyleTable)trans.GetObject(dbH.TextStyleTableId, OpenMode.ForWrite);                ObjectId id = GetIdFromSymbolTable(TST, name);                if (id == ObjectId.Null)                {                    TextStyleTableRecord TSTR = new TextStyleTableRecord();                    TSTR.Name = name;                    TSTR.FileName = smallfont;                    TSTR.BigFontFileName = bigfont;                    TSTR.TextSize = height;                    TSTR.XScale = xscale;                    TST.UpgradeOpen();                    id = TST.Add(TSTR);                    trans.AddNewlyCreatedDBObject(TSTR, true);                }                return id;            }        }        //取得符号表的Id        public static ObjectId GetIdFromSymbolTable(SymbolTable st, string key)        {            Database dbH = HostApplicationServices.WorkingDatabase;            using (Transaction trans = dbH.TransactionManager.StartTransaction())            {                if (st.Has(key))                {                    ObjectId idres = st[key];                    if (!idres.IsErased)                        return idres;                    foreach (ObjectId id in st)                    {                        if (!id.IsErased)                        {                            SymbolTableRecord str = (SymbolTableRecord)trans.GetObject(id, OpenMode.ForRead);                            if (str.Name == key)                                return id;                        }                    }                }            }            return ObjectId.Null;        }    }}如

这次我们先做了一个测试工具,其主要目的是利用toolbox工具箱的Mosaic To New Raster

这次我们先做了一个测试工具,其主要目的是利用toolbox工具箱的Mosaic To New Raster

将多个栅格数据合成一个栅格数据。如果说栅格数量少的话,手动选择并没有太大的影响。而如果栅格文件非常多的话,手动选择将浪费大量的时间和精力,为此我们写了一个小工具,将某个目录下所有的栅格数据一次性加入到上面的Mosaic To New Raster工具中,直接运行即可。说得直接一点就是直接调用了Mosaic To New Raster工具,一次性加入多个文件。在写完这个工具后遇到工具打包和工具多个参数类型问题,现将自己写这部分功能中遇到的问题特记录下来。

利用python调用arcpy脚本后,如果使用代码的方式让用户使用编写的脚本是极其的不方便和友好。为此,需要利用某种方式将写好的脚本代码封装成类似arcgis中工具箱的工具。将写好的代码的目录利用catalog将其添加到arcgis中,然后在arcgis中选择该目录,右击选择【New】、选择【Python ToolBox】。这样在该目录下就生成了Toolbox.pyt文件。具体操

排版|测绘科技

文案|测绘科技