- 博客(40)
- 收藏
- 关注
原创 AutoCAD—对象ID持久化
在每张dwg图纸上DBObject的Handle是唯一的,但同时如果两张dwg图纸同源(在某个时期复制成两份,分别修改演化),这两张dwg图纸中,同源部分会存在相同Handle的对象。再进行二次开发的过程中,有时需要将DBOjbect对象的“ID“信息记录来,以满足不同的业务要要求,比如在Block分解后的DBObject对象中,记录一下分解前的块参照”ID“标志,引便于将这些分解的对象分组。所以DBObject对象的Id属性不适合持久化管理,因为他是易变,不符合持久化的常理。
2024-08-23 16:02:59 357
原创 AutoCAD-扩展记录Xrecord
Xrecord(扩展记录)该类的设计就是为了提供更好的存储扩展数据的体验,它不算是一个图形对象,一般与DataBase的【命名字典】或者DBObject对象的【扩展字典】联合使用,实质上这两种字典是一种类型的对象(DBDictionary),只是所属对象不同。Xrecord会作为字典的键值存储相关扩展的信息。Xrecord关联数据的属性是Data,而非XData这是一个需要注意的地方,这里我建议就不要管其XData属性了,它继承自DBobject基类,直接当它不存在,不要有什么心里负担。
2024-08-16 21:28:52 982 1
原创 C#工具库-NPOI
NPOI是一个基于c#语言的,开源的,能够在不安装Microsoft Office组件的条件下读写Microsoft Office 的库。前身是Java的POI库,有“先贤”将其翻译成了c#语言的库,而这种由java到c#库的演变并非个例,比如DotNetty之于Netty之于在我的有限认知里面它算是c#里面读写excel最好的库(主观)。开源协议宽松和读写速度快。C#编程中引用NPOI类库的方法也很简单,通过Nuget进行包管理。项目中需要引用第三方库时,强烈建议优先使用nuget方式进行引用。
2024-08-16 15:01:39 1726
原创 Revit插件兼容2022版本升级策略(3) —方案设计
三、方案设计a、方案描述 通过上面两篇文章对背景和问题的分析,我们设计如下解决方案: 以兼容DIsplayUnityType和UnitForgeId(ForgeTypeId)为例 1、定义Revit单位类型替换类(UnifyTypeId统一类型ID) 2、将Revit对象实例中,包含DIsplayUnityType或者UnitForgeId(ForgeTypeId)的 方法或者属性,进行扩展重写,使用UnifyTypeId替代相关...
2021-12-13 12:50:14 1204
原创 Revit插件兼容2022版本升级策略(2) —问题分析
二、问题分析a、API变化分析 Revit2022主要的变化,或者说我们最在意的变化,是通用单位表示的变化。以及依赖单位的其他对象的属性和方法都要做调整。我先展示一下Revit版本从2020到2022单位相关的那些对象是如何演变的。 黄色的枚举类型,2021变成了弃用,到2022由绿色的类型代替 DisplayUnitType(int)——>UnitTypeId(ForgeTypeId) ...
2021-12-09 17:50:54 1776
原创 Revit插件兼容2022版本升级策略(1) —背景
一、背景 我们考虑兼容,其实是在做这样一件事:以应用级别源代码能够复用为目标,适应多个版本Revit提供的API的变化。 我们要适应多个Revit的API谈不上向前兼容向后兼容的概念。我们只是在以复用为前提,去做多个版本库Dll的适配。 在以往Revit插件适应新的Revit宿主版本的时候,我们的工作就是找到那些语义和功能一致,但是签名发生变化的那些函数,然后去适配这些函数,重新定义一个满足现有输入输出要求的新函数。常用做法就是做一个专门提供适配的项目,在这...
2021-12-09 16:37:48 1312
原创 计算几何——点P与区间A(Amin,Amax)的距离(2)
一、问题描述: 给定区间A(Amin,Amax)和点P。计算点P与区间A(Amin,Amax)的距离,如果在区间内,距离视为0;如果在区间外,P到区间最近端点的距离定义为点到区间的距离二、问题分析:绘图:分类讨论:1、如果P在区间内,距离为02、如果P小于区间最小值,距离为Amin-P3、如果P大运区间最大值,距离为P-Amax简化计算方法:Math.Max(0, Math.Max(A.Min-P,P-A.Max))...
2021-05-08 18:00:36 687
原创 Revit—创建IndependentTag报错
1、问题描述 有时候我们在通过IndependentTag.Create 创建标记时,会发生错误,“There is no tag available.”; 给人的感觉时,我们明明已经加载进了族类型,同时也激活了,怎么还会出问题?百思不得其解 2、问题分析: 其实这个可能和Revit的创建标签的机制有关系,其创建流程应该时,先在默认的设置里面去取一个类型创建出来,然后在修改成我们控制的类型。 ...
2021-04-14 09:06:36 648
原创 Revit—IUpdater注册注销报错
问题:你可能被下面的异常所困扰:Updater::getUpdaerId()::getAddInId() does not match currently active add-in's AddInId 看到这个异常,你可能还要去调试,确定这个addinId怎么就不匹配了,吧啦吧啦调试半天,也没弄出个所以然。问题剖析: 其实这个错误提示可能给了一些误导,之所以产生这个异常很大程度上是因为你在调用UpdaterRegistry中相关的注册,注销方法时没有处在一个...
2021-04-07 09:17:12 322
原创 Revit—视图可用性控制
预期效果:使指定视图对应的UI失去对键盘和鼠标的响应,类似于给控件设置了Enabled属性一、基本思路1、找到视图关联的界面窗体handle2、将handle设置为不可用二、涉及Win32Api1、获取窗体Textprivate const string DllName = "user32.dll"; [DllImport(DllName)] public static extern int GetWindowText(IntPtr hwnd, StringBuilder lp
2020-12-23 15:57:47 223
原创 计算几何——数轴区间判断相交(1)
问题描述: 给定区间A(Amin,Amax),B(Bmin,Bmax)。判断区间A与区间B是否相交问题分析: 如果我们把区间A看成固定不动的,区间B相对于区间A的位置状态有哪些呢? 将区间B的左端点固定不同,调整区间B的右端点,从左往右推导,能列出6种区间B的形态。如下图, 通过观察图形特点,聪明如你,一定很快就想到了一个简单的算法——分类讨论。 比如:1、当B的Bmin和Bmax同时小于Amin时,不相交...
2020-11-24 11:30:51 980 1
原创 WPF实战—让Grid的网格线显示出来
一、代码价值描述: 1、对附加属性的理解和应用 2、网格线细节处理(重叠边线问题的解决)二、主要思路: 将grid的子元素,套在一个border里面。控制border边框的显示形成网格线三、 使用方法和案例:<Grid Height="120" Grid.Row="1" cui:GridOptions.ShowBorder="True" ></Grid>四、工具源码: p...
2020-11-20 13:52:19 8356 2
原创 Revit—部分枚举中文名称获取LabelUtils
在二次开发过程中,可能会遇到取BuiltInCategory,BuiltInParameter等枚举的汉化中文显示的需求。Revit API提供了一个工具,LabelUtils。该工具能对一些常用的的内置枚举可以获取指定的语言显示。重点再说一遍:LabelUtils public class LabelUtils : IDisposable { ~LabelUtils(); public bool IsValidObject { g...
2020-09-09 09:03:26 426
原创 c#基础工具—对象克隆ObjectCloneUtils
一、情景分析 对象克隆对程序开发来说是一个很常见的小需求,就c#而言实现也很简单,浅克隆的的话使用MemberwiseClone,深克隆的话使用一种序列化方式,然后在反序列化就可以了。这篇文章提供的代码,不涉及到高深的技术,如果有什么亮点的话,可能就是通用话强点。二、代码设计要求 1、要实现两个方法:浅克隆Clone和深DeepClone 2、要做到比较通用,支持泛型。使用方便,一遍需求不用增加代码 3、根据约定优于配置的原则,在设计中减少接口和配置文件的约束。但要能灵活的控制...
2020-09-06 19:03:26 1365
原创 WPF—多值转换器IMultiValueConverter
在实际的开发中,经常会有这样的需要,当一个属性变化时,需要其他属性一起联动发生变化。这种变化如果只是后台之间属性之间的约束,直接写在后台代码中也无所谓,甚至可以说是这样组织是一个不错的策略。 但是,如果这种变化只体现在界面的联动效果上,比如属性A的变化,影响到属性B在界面上是否可以编辑。在这种场景中,如果后台代码过分干预前台的显示效果,反而显得设计过于耦合了。我们可以把这种变化,通过转换器在前台实现控制。WPF的转换器分为单值转换器,和多值转换器。既然是属性变化影响的是其...
2020-07-26 21:47:45 3613
原创 c#—string相关方法,日用而不知的细节
string.IsNullOrWhiteSpace(),这个方法可以过滤功能符号,比如说换行符,回车符号。 “aaa”.Contains(string.Empty),返回True
2020-07-19 16:05:33 152
原创 你的代码能力是哪个级别?
闲来有感,感叹学习能力的下降和学习目的的盲目,静下心来找找自己的位置。 欢迎大家自动来对号入座 我把程序员写代码分成六个状态,后来想了想,其实这套分级可以对应到任何领域一、 具体分级和练级指南起心立志 道路:学习和记忆基础知识识别基本语法(能看得下去) 道路:掌握一些通用成熟的固定技巧,常规表达方式。读懂代码(能看懂) 道路:1、 能根据需求实现功能。但具体原理不是太清楚,不太清楚的意思是:不知道怎么用好,怎么用不好,存在什...
2020-07-06 10:45:26 1947
原创 WPF—添加字体,fontawesome
WPF使用字体时,可以不在系统中进行安装,直接引用字体文件就可以。这是一个不错的性能,这样尽可能保持了程序本身的自管理。 经常有一些需求需要引用一些常见图标,fontawesome就是一个不错的选择。矢量字符充当图标与位图相比有他自身的优势,这里就不展开说了。那么WPF程序中,如何引用字符图标呢? 准备: 1、下载字体 2、将字体文件,放到指定的目录下。例如放在下图位置, 方法一:xaml方式,定义资源引用<...
2020-05-17 22:22:40 1111 1
原创 WPF—Win32交互
我们如何设置Window的Owner为指定的Handle呢?这涉及一个win32交互的问题。方法一:使用WindowInteropHelper首先我们一般的常规做法是,重写窗体的OnSourceInitialized方法或者绑定SourceInitialized事件。在它们相关联的代码中面去处理。为什么在这里处理呢,因为窗体执行到这一步才能确定自己的Handle值。WindowInteropHelper取到的Handle值才有意义,否则就要使用EnsureHandle了。 ..
2020-05-10 20:17:24 393
原创 WPF—ToolTip没有数据时,自动不显示
<Style TargetType="ToolTip"> <Style.Triggers> <Trigger Property="Content" Value="{x:Static sys:String.Empt...
2020-05-03 21:19:05 1857 1
原创 Revit—门关联房间
门(Door)相关FamilyInstance存在两个有效的可用属性ToRoom,FromRoom,在我们判断房间关系和门朝向时是不错的参考信息。但不幸的是,在项目使用过程中,发现在某些情况下直接获取上述两个属性会发生异常。一开始并没有发现导致异常的原因是什么,所以项目中就放弃了使用这两个属性。 后来经过研究发现,应该是当Door的删除阶段(DemolishedP...
2020-04-22 14:01:08 715
原创 Revit—视图联动
网上已经有人写过一些视图联动的帖子了,我这里将这个功能封装成一个类,以方便使用。核心思想第一步:组织需要关联的视图集合。这些视图要存在对应的UIView才有意义;第二步:绑定UIApplication的Idling和ViewActivated事件; 1、Idling事件处理UI视图显示范围同步,以ActiveView为基准,调整其他视图;...
2020-04-08 07:45:05 1309
原创 WPF—TextBox 后台绑定double,如何让前台不显示默认0
采用的方法是使用Nullable<double>代替double 。 Nullable<double>和double的操纵对用户来说是透明的,可以无差别的混合使用它们。 但是Nullable<double>多了一个可以判断值类型是否有效的好处,这个体现到前台的好处就是TextBox可以显示空白。 ...
2020-03-29 20:58:00 2305
原创 C#—空集Any函数和All函数语义
在c#集合列表的众多扩展方法中,Any方法和All方法是比较常用。Any语义:任意一个元素满足条件则返回true,否则返回fase;All语义:所有元素满足条件则返回true,否则返回false但是,如果集合本身是空集,即集合元素个数为0,可能会对使用者的正常逻辑产生混淆当集合是空集的情况,Any方法和All方法,会忽略条件判断语句,以空集的意义返回判断结果。即:当集合为空集时...
2020-03-15 07:24:49 5645
原创 Revit—WPF类库不明原因的不能加载?
乱语: 你打发无聊时间的方法,决定了你的成色。 今天是庚子年一月一日,就是俗话说的大年初一。全国被新型冠状病毒引发的传染病所笼罩,当看到那些冲向灾区的逆行者,除了泪目之外,还从心底发出一定要做点儿什么的急切心愿。 我们这些做程序的,自嘲了称呼声码农,往大了说那也是工程师,留下下点儿有用于世间的东西吧。于是写下了这篇文章。 正文: ...
2020-01-25 18:27:18 659 2
原创 命名这门学问
写在最前面,这篇文章敬网上有这方面思考的各位大神。我有这方面困惑的时候,参考了很多前人的思考,再次感谢。此篇文章更像是自己总结的一个备忘笔记 名不正,则言不顺。好的命名,堪比好的算法。甚至有时候一个合适的命名,就能省掉几十行的注释。并且让人印象深刻。当你开始关注命名这个问题时,你可能已经发现其中的秒处了。 在懊恼的选择中,纵向寻求一些规则,让自己做事显得...
2020-01-06 12:33:03 222
原创 c# await和async入门
一、是什么: await async都是所谓的上下文关键字。上下文关键字,就是在特殊的语境下是关键字,脱离语境就是普通的标识符二、怎么用(大匠诲人必以规矩的规矩)async 用来修饰方法,表明方法是异步的。方法的返回值必须是void、Task、Task<TResult>其中的一种。await表示等待某个任务执行完。await必须用来修饰Task或Task&...
2019-12-08 22:44:34 557
原创 Revit MEP二开
前言第一章、创建管线 1、创建普通的管线 2、创建竖向方形管线 3、设备出管 4、其他第二章、连接管线 1、连接件的创建 2、管线打断 3、风口和管道末端 4、来捣乱的保温层第三章、创建设备 1、自由布置 2、管线相关布置:第四章、连接设备 1、初次连接 2、二次修改连接第...
2019-11-03 22:14:58 495 1
原创 Revit—获取文件版本(支持17至20)
写过一篇文章,是分析如何在不打开Revit情况下获取Revit文件的版本信息。里面介绍了解决这个问题的整体思路,但现在看来太繁琐了。这里直接将获取版本的方法代码奉上。如果对其他Revit文件感兴趣,可以移步这里获取Revit文件版本。 下面的方法兼容了2017到2020的特殊处理。 public static class RevitFil...
2019-10-23 11:49:30 1961
原创 Revit—CableTray and Conduit 桥架线管打断
承接上两篇文章的讨论第一篇:Revit—线管连接桥架第二篇:Revit—Duct打断和Pipe打断这篇文章讲一下实现桥架线管打断的思路,并提供可用方法代码 打断管线并不复杂,复杂的是要恢复原有管线的连接。桥架和线管有和水管不一样的特点,上面第一篇文章写了,它能连接成你“意想不到”的样子,要恢复这种连接,也就存在一些技巧了。 另外,根据文章二提到的R...
2019-10-16 12:47:30 1648 1
原创 Revit—线管连接桥架
Revit中,是支持线管连接桥架和无配件桥架与桥架之间相互连接的。 如果你项目中需要类似的功能,这篇文章大概率能解决你的问题。Revit没有显示的API进行类似的操作。但是在一些你可能熟悉的API中提供了类似隐藏的功能。比如这次我们用到的就是NewTeeFitting这个函数。 函数签名:public FamilyInstance NewTeeFitti...
2019-10-10 13:24:16 2969
原创 Revit—Duct打断和Pipe打断
在Revit管线连接过程中,有些情况下需要将输入的管线进行打断处理在进行连接。 风系统和水系统提供了相关的的打断API,非常完美,可以放心使用。线管和桥架的打断,Revit没有提供相应的API,如果自己实现的话思路上不难,但是里面有坑要填。什么坑呢?具体的下次有机会再说,主要是桥架上也能产生Curve类型的Connector。 风系统管线打...
2019-10-10 13:06:01 2176
原创 RegistryKey读取注册表,明明看得到却读不到?
注册表这个东西,我们平常用的很少。真正在开发中遇到使用的时候,大多也是现学现卖。如果你遇到了如题的那种窘况,很可能是操作系统的位数原因导致的。不要直接使用:var localMachineKey=Registry.LocalMachine;而是使用如下与计算机位数相关的代码var useRegistryView = Environment.Is64BitOpera...
2019-09-27 21:55:48 1034
原创 Revit获取安装路径,零依赖Revit提供的dll
通过RevitAddInUtility.dll提供的方法,我们很容易获取到一些本地Revit安装的信息,比如安装的版本,安装路径,和插件配置文件所在的文件夹等。 但如果你对代码有洁癖,觉得为了这么点事儿,没必要去引用一个外部Dll。或者其他别的什么原因都可以,导致不想去引用RevitAddInUtility.dll这个类库,同时又想获取到Revit安装的相关信息怎...
2019-09-27 21:46:50 1075
原创 Revit——获取线管类型可以使用的管径
如题要获取线管类型的可用直径,主要使用到的是ConduitSizeSettings这个类。namespace Autodesk.Revit.DB.Electrical{ public class ConduitSizeSettings : Element, IEnumerable<KeyValuePair<string, ConduitSizes>> ...
2019-09-26 11:15:34 938
原创 Revit文件版本判定(不打开Revit方式)
一、问题引入 拿到一个revit的.rvt文件,需要判断一下该文件是由哪个Revit版本创建的。然后根据这个判定执行不同的逻辑。最简单的应用就是,选择合适的revit版本打开revit文件。二、探索1、解析.rvt文件流。思路:拿到.rvt的文件流,然后判断流中是否包含类似2018,2017的东西。结论:这种方法是可以的。探索过程:1、在通过无数次的实验之后...
2019-08-03 21:22:39 5368 8
原创 Revit在平面视图中创建空间
说到Revit批量创建空间,这本不是一个什么困难的事情。Revit本身就自带这样的命令。通过Revit自带命令,在指定的平面视图创建元空间的方式,如下面动图所示: 但我们搞Revit二次开的,要怎么使用代码实现呢? 我尝试了如下思考一、模拟Revit命令操作,调用Revit固有命令创建。步骤1、将视图切换到需要创建空间的平面视图;步骤2、调用Revit命令 分析-...
2019-07-28 23:28:54 1277
原创 Revit文件导出svg格式思考
Revit没有直接导出svg格式文件的方法,但是动动脑子,还是会有一些不太靠谱的方法,可以完成这件事情。说它不太靠谱是因为这些方法非官方,并且这些方法用起来存在这样或那样的问题,很难百分百满足既定需求。 下面列举三种思路,以期抛砖引玉。它们分别为借助外部工具,借助外部dll,自定义解析。我会分别具体叙述一下这几种方法是什么思路。一、借助外部工具 这...
2019-07-25 09:50:49 1335
原创 设置Revit命令默认使用类型
在绘制墙,梁,柱,管道,标记的图元时,如何设置默认使用的类型呢(ElementType of FamilySymbol)?这只是调用一个方法的问题,先把结论奉上public void SetDefaultFamilyTypeId( ElementId familyCategoryId, ElementId familyTypeId)问题引入:对Revit进行操作过的程...
2019-07-23 10:08:40 869
原创 Revit自带命令图标获取
有时候,我们对Revit本身自带的命令显示的图标产生了兴趣,要怎么才能获取到这些图片呢。直接在安装目录下找好像并没有找到。那就只能换个思路了...思路:反编译Revit图标资源类库UIFrameworkRes.dll,获取Revit自身命令的图标资源流,保存到本地。1、首先找到UIFrameworkRes.dll所在的位置,这个文件在Revit的安装目录下。2、调用Revit生成图标的...
2019-07-21 23:39:41 2221
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人