iEPC数字化全过程工程管理平台(以下简称 iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI diff --git a/page/23/index.html b/page/23/index.html index ac04f1746e..3354ff03c5 100644 --- a/page/23/index.html +++ b/page/23/index.html @@ -1240,7 +1240,7 @@
-
+
@@ -1258,7 +1258,7 @@
- C# 读取嵌入的文件
+ 数组下标无限循环算法
@@ -1303,7 +1303,7 @@
本文字数:
- 283
+ 204
@@ -1321,10 +1321,10 @@
- 如何在 C# 中读取嵌入的文件资源?
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
diff --git a/page/24/index.html b/page/24/index.html
index 65520bdc07..d3cadbd8f8 100644
--- a/page/24/index.html
+++ b/page/24/index.html
@@ -205,7 +205,7 @@ 星辰大海
-
+
@@ -223,7 +223,7 @@ 星辰大海
- 数组下标无限循环算法
+ C# 读取嵌入的文件
@@ -268,7 +268,7 @@
本文字数:
- 204
+ 283
@@ -286,10 +286,10 @@
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ 如何在 C# 中读取嵌入的文件资源?
diff --git a/page/30/index.html b/page/30/index.html
index e1a17ce791..598042768e 100644
--- a/page/30/index.html
+++ b/page/30/index.html
@@ -547,7 +547,7 @@
-
+
@@ -565,7 +565,7 @@
- American accent
+ American accent practice
@@ -602,14 +602,14 @@
本文字数:
- 2.1k
+ 308
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -620,10 +620,10 @@
- There are the notes of American accent.
+ There are some experience in my studying.
@@ -654,7 +654,7 @@
-
+
@@ -672,7 +672,7 @@
- American accent practice
+ American accent
@@ -709,14 +709,14 @@
本文字数:
- 308
+ 2.1k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -727,10 +727,10 @@
- There are some experience in my studying.
+ There are the notes of American accent.
@@ -1116,7 +1116,7 @@
-
+
@@ -1134,7 +1134,7 @@
- MS中曲线总结
+ 优先社区二次开发学习
@@ -1175,14 +1175,14 @@
本文字数:
- 130
+ 1.9k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -1193,14 +1193,10 @@
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
@@ -1231,7 +1227,7 @@
-
+
@@ -1249,7 +1245,7 @@
- 优先社区二次开发学习
+ MS中曲线总结
@@ -1290,14 +1286,14 @@
本文字数:
- 1.9k
+ 130
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -1308,10 +1304,14 @@
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
@@ -265,8 +265,8 @@ English
diff --git a/tags/NET/index.html b/tags/NET/index.html
index 95093bfce7..f22a066c20 100644
--- a/tags/NET/index.html
+++ b/tags/NET/index.html
@@ -351,8 +351,8 @@ .NET
@@ -371,8 +371,8 @@ .NET
diff --git a/tags/NET/page/2/index.html b/tags/NET/page/2/index.html
index bb45b52070..fef2534368 100644
--- a/tags/NET/page/2/index.html
+++ b/tags/NET/page/2/index.html
@@ -245,8 +245,8 @@ .NET
@@ -265,8 +265,8 @@ .NET
diff --git a/tags/Vue/index.html b/tags/Vue/index.html
index f816b11c47..f2d3bd2686 100644
--- a/tags/Vue/index.html
+++ b/tags/Vue/index.html
@@ -351,8 +351,8 @@ vue
@@ -371,8 +371,8 @@ vue
- C# 读取嵌入的文件 + 数组下标无限循环算法
本文字数:
- 283
+ 204
@@ -1321,10 +1321,10 @@
- 如何在 C# 中读取嵌入的文件资源?
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
diff --git a/page/24/index.html b/page/24/index.html
index 65520bdc07..d3cadbd8f8 100644
--- a/page/24/index.html
+++ b/page/24/index.html
@@ -205,7 +205,7 @@ 星辰大海
-
+
@@ -223,7 +223,7 @@ 星辰大海
- 数组下标无限循环算法
+ C# 读取嵌入的文件
@@ -268,7 +268,7 @@
本文字数:
- 204
+ 283
@@ -286,10 +286,10 @@
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ 如何在 C# 中读取嵌入的文件资源?
diff --git a/page/30/index.html b/page/30/index.html
index e1a17ce791..598042768e 100644
--- a/page/30/index.html
+++ b/page/30/index.html
@@ -547,7 +547,7 @@
-
+
@@ -565,7 +565,7 @@
- American accent
+ American accent practice
@@ -602,14 +602,14 @@
本文字数:
- 2.1k
+ 308
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -620,10 +620,10 @@
- There are the notes of American accent.
+ There are some experience in my studying.
@@ -654,7 +654,7 @@
-
+
@@ -672,7 +672,7 @@
- American accent practice
+ American accent
@@ -709,14 +709,14 @@
本文字数:
- 308
+ 2.1k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -727,10 +727,10 @@
- There are some experience in my studying.
+ There are the notes of American accent.
@@ -1116,7 +1116,7 @@
-
+
@@ -1134,7 +1134,7 @@
- MS中曲线总结
+ 优先社区二次开发学习
@@ -1175,14 +1175,14 @@
本文字数:
- 130
+ 1.9k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -1193,14 +1193,10 @@
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
@@ -1231,7 +1227,7 @@
-
+
@@ -1249,7 +1245,7 @@
- 优先社区二次开发学习
+ MS中曲线总结
@@ -1290,14 +1286,14 @@
本文字数:
- 1.9k
+ 130
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -1308,10 +1304,14 @@
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
@@ -265,8 +265,8 @@ English
diff --git a/tags/NET/index.html b/tags/NET/index.html
index 95093bfce7..f22a066c20 100644
--- a/tags/NET/index.html
+++ b/tags/NET/index.html
@@ -351,8 +351,8 @@ .NET
@@ -371,8 +371,8 @@ .NET
diff --git a/tags/NET/page/2/index.html b/tags/NET/page/2/index.html
index bb45b52070..fef2534368 100644
--- a/tags/NET/page/2/index.html
+++ b/tags/NET/page/2/index.html
@@ -245,8 +245,8 @@ .NET
@@ -265,8 +265,8 @@ .NET
diff --git a/tags/Vue/index.html b/tags/Vue/index.html
index f816b11c47..f2d3bd2686 100644
--- a/tags/Vue/index.html
+++ b/tags/Vue/index.html
@@ -351,8 +351,8 @@ vue
如何在 C# 中读取嵌入的文件资源?
+在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
diff --git a/page/24/index.html b/page/24/index.html index 65520bdc07..d3cadbd8f8 100644 --- a/page/24/index.html +++ b/page/24/index.html @@ -205,7 +205,7 @@星辰大海
星辰大海
- 数组下标无限循环算法 + C# 读取嵌入的文件
本文字数:
- 204
+ 283
@@ -286,10 +286,10 @@
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ 如何在 C# 中读取嵌入的文件资源?
diff --git a/page/30/index.html b/page/30/index.html
index e1a17ce791..598042768e 100644
--- a/page/30/index.html
+++ b/page/30/index.html
@@ -547,7 +547,7 @@
-
+
@@ -565,7 +565,7 @@
- American accent
+ American accent practice
@@ -602,14 +602,14 @@
本文字数:
- 2.1k
+ 308
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -620,10 +620,10 @@
- There are the notes of American accent.
+ There are some experience in my studying.
@@ -654,7 +654,7 @@
-
+
@@ -672,7 +672,7 @@
- American accent practice
+ American accent
@@ -709,14 +709,14 @@
本文字数:
- 308
+ 2.1k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -727,10 +727,10 @@
- There are some experience in my studying.
+ There are the notes of American accent.
@@ -1116,7 +1116,7 @@
-
+
@@ -1134,7 +1134,7 @@
- MS中曲线总结
+ 优先社区二次开发学习
@@ -1175,14 +1175,14 @@
本文字数:
- 130
+ 1.9k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -1193,14 +1193,10 @@
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
@@ -1231,7 +1227,7 @@
-
+
@@ -1249,7 +1245,7 @@
- 优先社区二次开发学习
+ MS中曲线总结
@@ -1290,14 +1286,14 @@
本文字数:
- 1.9k
+ 130
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -1308,10 +1304,14 @@
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
@@ -265,8 +265,8 @@ English
diff --git a/tags/NET/index.html b/tags/NET/index.html
index 95093bfce7..f22a066c20 100644
--- a/tags/NET/index.html
+++ b/tags/NET/index.html
@@ -351,8 +351,8 @@ .NET
@@ -371,8 +371,8 @@ .NET
diff --git a/tags/NET/page/2/index.html b/tags/NET/page/2/index.html
index bb45b52070..fef2534368 100644
--- a/tags/NET/page/2/index.html
+++ b/tags/NET/page/2/index.html
@@ -245,8 +245,8 @@ .NET
在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+如何在 C# 中读取嵌入的文件资源?
diff --git a/page/30/index.html b/page/30/index.html index e1a17ce791..598042768e 100644 --- a/page/30/index.html +++ b/page/30/index.html @@ -547,7 +547,7 @@
-
+
@@ -565,7 +565,7 @@
- American accent
+ American accent practice
@@ -602,14 +602,14 @@
本文字数:
- 2.1k
+ 308
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -620,10 +620,10 @@
- There are the notes of American accent.
+ There are some experience in my studying.
@@ -654,7 +654,7 @@
-
+
@@ -672,7 +672,7 @@
- American accent practice
+ American accent
@@ -709,14 +709,14 @@
本文字数:
- 308
+ 2.1k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -727,10 +727,10 @@
- There are some experience in my studying.
+ There are the notes of American accent.
@@ -1116,7 +1116,7 @@
-
+
@@ -1134,7 +1134,7 @@
- MS中曲线总结
+ 优先社区二次开发学习
@@ -1175,14 +1175,14 @@
本文字数:
- 130
+ 1.9k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -1193,14 +1193,10 @@
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
@@ -1231,7 +1227,7 @@
-
+
@@ -1249,7 +1245,7 @@
- 优先社区二次开发学习
+ MS中曲线总结
@@ -1290,14 +1286,14 @@
本文字数:
- 1.9k
+ 130
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -1308,10 +1304,14 @@
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
@@ -265,8 +265,8 @@ English
diff --git a/tags/NET/index.html b/tags/NET/index.html
index 95093bfce7..f22a066c20 100644
--- a/tags/NET/index.html
+++ b/tags/NET/index.html
@@ -351,8 +351,8 @@ .NET
@@ -371,8 +371,8 @@ .NET
- American accent + American accent practice
本文字数: - 2.1k + 308 阅读时长 ≈ - 2 分钟 + 1 分钟
- There are the notes of American accent.
+ There are some experience in my studying.
@@ -654,7 +654,7 @@
-
+
@@ -672,7 +672,7 @@
- American accent practice
+ American accent
@@ -709,14 +709,14 @@
本文字数:
- 308
+ 2.1k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -727,10 +727,10 @@
- There are some experience in my studying.
+ There are the notes of American accent.
@@ -1116,7 +1116,7 @@
-
+
@@ -1134,7 +1134,7 @@
- MS中曲线总结
+ 优先社区二次开发学习
@@ -1175,14 +1175,14 @@
本文字数:
- 130
+ 1.9k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -1193,14 +1193,10 @@
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
@@ -1231,7 +1227,7 @@
-
+
@@ -1249,7 +1245,7 @@
- 优先社区二次开发学习
+ MS中曲线总结
@@ -1290,14 +1286,14 @@
本文字数:
- 1.9k
+ 130
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -1308,10 +1304,14 @@
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
@@ -265,8 +265,8 @@ English
diff --git a/tags/NET/index.html b/tags/NET/index.html
index 95093bfce7..f22a066c20 100644
--- a/tags/NET/index.html
+++ b/tags/NET/index.html
@@ -351,8 +351,8 @@ .NET
@@ -371,8 +371,8 @@ .NET
There are the notes of American accent.
+There are some experience in my studying.
@@ -654,7 +654,7 @@
-
+
@@ -672,7 +672,7 @@
- American accent practice
+ American accent
@@ -709,14 +709,14 @@
本文字数:
- 308
+ 2.1k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -727,10 +727,10 @@
- There are some experience in my studying.
+ There are the notes of American accent.
@@ -1116,7 +1116,7 @@
-
+
@@ -1134,7 +1134,7 @@
- MS中曲线总结
+ 优先社区二次开发学习
@@ -1175,14 +1175,14 @@
本文字数:
- 130
+ 1.9k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -1193,14 +1193,10 @@
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
@@ -1231,7 +1227,7 @@
-
+
@@ -1249,7 +1245,7 @@
- 优先社区二次开发学习
+ MS中曲线总结
@@ -1290,14 +1286,14 @@
本文字数:
- 1.9k
+ 130
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -1308,10 +1304,14 @@
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
@@ -265,8 +265,8 @@ English
diff --git a/tags/NET/index.html b/tags/NET/index.html
index 95093bfce7..f22a066c20 100644
--- a/tags/NET/index.html
+++ b/tags/NET/index.html
@@ -351,8 +351,8 @@ .NET
- American accent practice + American accent
本文字数: - 308 + 2.1k 阅读时长 ≈ - 1 分钟 + 2 分钟
- There are some experience in my studying.
+ There are the notes of American accent.
@@ -1116,7 +1116,7 @@
-
+
@@ -1134,7 +1134,7 @@
- MS中曲线总结
+ 优先社区二次开发学习
@@ -1175,14 +1175,14 @@
本文字数:
- 130
+ 1.9k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -1193,14 +1193,10 @@
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
@@ -1231,7 +1227,7 @@
-
+
@@ -1249,7 +1245,7 @@
- 优先社区二次开发学习
+ MS中曲线总结
@@ -1290,14 +1286,14 @@
本文字数:
- 1.9k
+ 130
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -1308,10 +1304,14 @@
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
@@ -265,8 +265,8 @@ English
diff --git a/tags/NET/index.html b/tags/NET/index.html
index 95093bfce7..f22a066c20 100644
--- a/tags/NET/index.html
+++ b/tags/NET/index.html
@@ -351,8 +351,8 @@ .NET
There are some experience in my studying.
+There are the notes of American accent.
@@ -1116,7 +1116,7 @@
-
+
@@ -1134,7 +1134,7 @@
- MS中曲线总结
+ 优先社区二次开发学习
@@ -1175,14 +1175,14 @@
本文字数:
- 130
+ 1.9k
阅读时长 ≈
- 1 分钟
+ 2 分钟
@@ -1193,14 +1193,10 @@
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
@@ -1231,7 +1227,7 @@
-
+
@@ -1249,7 +1245,7 @@
- 优先社区二次开发学习
+ MS中曲线总结
@@ -1290,14 +1286,14 @@
本文字数:
- 1.9k
+ 130
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -1308,10 +1304,14 @@
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
@@ -265,8 +265,8 @@ English
- MS中曲线总结 + 优先社区二次开发学习
本文字数: - 130 + 1.9k 阅读时长 ≈ - 1 分钟 + 2 分钟
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
@@ -1231,7 +1227,7 @@
-
+
@@ -1249,7 +1245,7 @@
- 优先社区二次开发学习
+ MS中曲线总结
@@ -1290,14 +1286,14 @@
本文字数:
- 1.9k
+ 130
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -1308,10 +1304,14 @@
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
@@ -265,8 +265,8 @@ English
MS -二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的 -API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用 -MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
+最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
@@ -1231,7 +1227,7 @@
-
+
@@ -1249,7 +1245,7 @@
- 优先社区二次开发学习
+ MS中曲线总结
@@ -1290,14 +1286,14 @@
本文字数:
- 1.9k
+ 130
阅读时长 ≈
- 2 分钟
+ 1 分钟
@@ -1308,10 +1304,14 @@
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
- 优先社区二次开发学习 + MS中曲线总结
本文字数: - 1.9k + 130 阅读时长 ≈ - 2 分钟 + 1 分钟
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html
index f3aed1fb24..4023cb3fa8 100644
--- a/page/31/index.html
+++ b/page/31/index.html
@@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
diff --git a/tags/English/index.html b/tags/English/index.html
index 9aca5bd2d2..41d35deeb5 100644
--- a/tags/English/index.html
+++ b/tags/English/index.html
@@ -245,8 +245,8 @@ English
最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+MS +二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的 +API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用 +MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
diff --git a/page/31/index.html b/page/31/index.html index f3aed1fb24..4023cb3fa8 100644 --- a/page/31/index.html +++ b/page/31/index.html @@ -657,7 +657,7 @@
-
+
@@ -675,7 +675,7 @@
- PropertyGrid 中只显示部分属性
+ PropertyGrid 中实现动态的下拉选项
@@ -716,14 +716,14 @@
本文字数:
- 12k
+ 1.1k
阅读时长 ≈
- 11 分钟
+ 1 分钟
@@ -734,12 +734,12 @@
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
- PropertyGrid 中只显示部分属性 + PropertyGrid 中实现动态的下拉选项
本文字数: - 12k + 1.1k 阅读时长 ≈ - 11 分钟 + 1 分钟
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual -Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性 +(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
@@ -770,7 +770,7 @@
-
+
@@ -788,7 +788,7 @@
- PropertyGrid 中实现动态的下拉选项
+ PropertyGrid 中只显示部分属性
@@ -829,14 +829,14 @@
本文字数:
- 1.1k
+ 12k
阅读时长 ≈
- 1 分钟
+ 11 分钟
@@ -847,12 +847,12 @@
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
- PropertyGrid 中实现动态的下拉选项 + PropertyGrid 中只显示部分属性
本文字数: - 1.1k + 12k 阅读时长 ≈ - 1 分钟 + 11 分钟
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html
index 151a509f1f..1bc5aaea2b 100644
--- a/page/32/index.html
+++ b/page/32/index.html
@@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
diff --git a/tags/C/page/3/index.html b/tags/C/page/3/index.html
index a059127df3..0208fe5556 100644
--- a/tags/C/page/3/index.html
+++ b/tags/C/page/3/index.html
@@ -225,8 +225,8 @@ C#
在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性 -(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual +Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
diff --git a/page/32/index.html b/page/32/index.html index 151a509f1f..1bc5aaea2b 100644 --- a/page/32/index.html +++ b/page/32/index.html @@ -1034,7 +1034,7 @@
-
+
@@ -1052,7 +1052,7 @@
- 16款优秀的Vue UI组件库推荐
+ vue通信及组件之间传值
@@ -1101,14 +1101,14 @@
本文字数:
- 5k
+ 1.2k
阅读时长 ≈
- 5 分钟
+ 1 分钟
@@ -1119,16 +1119,18 @@
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
- 16款优秀的Vue UI组件库推荐 + vue通信及组件之间传值
本文字数: - 5k + 1.2k 阅读时长 ≈ - 5 分钟 + 1 分钟
- Vue
-是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
-在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
-开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
-在选择Vue
-UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
-UI组件库。
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
@@ -1159,7 +1161,7 @@
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
diff --git a/posts/2020/3GJFFVV.html b/posts/2020/3GJFFVV.html
index b2109f2ef9..db231469b7 100644
--- a/posts/2020/3GJFFVV.html
+++ b/posts/2020/3GJFFVV.html
@@ -358,13 +358,13 @@
diff --git a/posts/2020/B9PE5D.html b/posts/2020/B9PE5D.html
index d3a108a8c6..49fd3bef6d 100644
--- a/posts/2020/B9PE5D.html
+++ b/posts/2020/B9PE5D.html
@@ -444,8 +444,8 @@ Resource And Thanks
diff --git a/posts/2020/JJQETR.html b/posts/2020/JJQETR.html
index bfbf0d6f53..2d256d3467 100644
--- a/posts/2020/JJQETR.html
+++ b/posts/2020/JJQETR.html
@@ -365,8 +365,8 @@ 详细介绍
diff --git a/posts/2020/K6BTSD.html b/posts/2020/K6BTSD.html
index 0ac5aaa46b..92ab3254bd 100644
--- a/posts/2020/K6BTSD.html
+++ b/posts/2020/K6BTSD.html
@@ -352,13 +352,13 @@
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
Vue -是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。 -在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。 -开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。 -在选择Vue -UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue -UI组件库。
+常用 vue 通信大概有这几种方式进行:
+-
+
- 组件间的父子之间的传值 +
- 组件间的子父之间的传值 +
- 非组件间的组件间的传值(简称:EventBus) +
- sessionStorage 缓存传值 +
- 路由带参数跳转进行传值 +
- vuex 进行传值 +
-
+
@@ -1177,7 +1179,7 @@
- vue通信及组件之间传值
+ 16款优秀的Vue UI组件库推荐
@@ -1226,14 +1228,14 @@
本文字数:
- 1.2k
+ 5k
阅读时长 ≈
- 1 分钟
+ 5 分钟
@@ -1244,18 +1246,16 @@
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
- vue通信及组件之间传值 + 16款优秀的Vue UI组件库推荐
本文字数: - 1.2k + 5k 阅读时长 ≈ - 1 分钟 + 5 分钟
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
+ Vue
+是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。
+在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。
+开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。
+在选择Vue
+UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue
+UI组件库。
diff --git a/page/33/index.html b/page/33/index.html
index 90cf75e65f..94fa2eff97 100644
--- a/page/33/index.html
+++ b/page/33/index.html
@@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
常用 vue 通信大概有这几种方式进行:
--
-
- 组件间的父子之间的传值 -
- 组件间的子父之间的传值 -
- 非组件间的组件间的传值(简称:EventBus) -
- sessionStorage 缓存传值 -
- 路由带参数跳转进行传值 -
- vuex 进行传值 -
Vue +是一个轻巧、高性能、可组件化的MVVM库,API简洁明了,上手快。从Vue推出以来,得到众多Web开发者的认可。 +在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用。 +开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了。 +在选择Vue +UI组件库的过程中,通过GitHub上根据star数量、文档丰富程度、更新的频率以及维护等因素,也收集整理了一些优秀的Vue +UI组件库。
diff --git a/page/33/index.html b/page/33/index.html index 90cf75e65f..94fa2eff97 100644 --- a/page/33/index.html +++ b/page/33/index.html @@ -433,7 +433,7 @@
-
+
@@ -451,7 +451,7 @@
- 最全最详细 http 状态码介绍
+ RESTful API 规范
@@ -492,14 +492,14 @@
本文字数:
- 11k
+ 67
阅读时长 ≈
- 10 分钟
+ 1 分钟
@@ -510,20 +510,10 @@
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
- 最全最详细 http 状态码介绍 + RESTful API 规范
本文字数: - 11k + 67 阅读时长 ≈ - 10 分钟 + 1 分钟
- HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
-
-
-
- 阅读全文 »
-
-
-
-
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+
@@ -549,7 +539,7 @@
-
+
@@ -567,7 +557,7 @@
- RESTful API 规范
+ 最全最详细 http 状态码介绍
@@ -608,14 +598,14 @@
本文字数:
- 67
+ 11k
阅读时长 ≈
- 1 分钟
+ 10 分钟
@@ -626,10 +616,20 @@
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
HTTP 响应状态代码指示特定 HTTP
-请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
-(500
–599
)。状态代码由 section 10 of RFC
-2616定义
HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+- RESTful API 规范 + 最全最详细 http 状态码介绍
本文字数: - 67 + 11k 阅读时长 ≈ - 1 分钟 + 10 分钟
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-
+ HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
+
+
+
+ 阅读全文 »
+
+
+
+
diff --git a/page/37/index.html b/page/37/index.html
index d0b776acde..3dd9ff8ab6 100644
--- a/page/37/index.html
+++ b/page/37/index.html
@@ -317,7 +317,7 @@
-
+
@@ -335,7 +335,7 @@
- Color 颜色对照表
+ 在 Winform、WPF 中使用 Font Awesome
@@ -376,14 +376,14 @@
本文字数:
- 3.5k
+ 865
阅读时长 ≈
- 3 分钟
+ 1 分钟
@@ -394,10 +394,12 @@
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
- +HTTP 响应状态代码指示特定 HTTP
+请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误
+(500
–599
)。状态代码由 section 10 of RFC
+2616定义
- Color 颜色对照表 + 在 Winform、WPF 中使用 Font Awesome
本文字数: - 3.5k + 865 阅读时长 ≈ - 3 分钟 + 1 分钟
- Color 颜色对照表。
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
diff --git a/posts/2019/1TFVRP.html b/posts/2019/1TFVRP.html
index fc02204e3b..21f1c33196 100644
--- a/posts/2019/1TFVRP.html
+++ b/posts/2019/1TFVRP.html
@@ -386,13 +386,13 @@ 致谢
diff --git a/posts/2019/3QMZ3K8.html b/posts/2019/3QMZ3K8.html
index 5ad24736a6..5de0f6afb5 100644
--- a/posts/2019/3QMZ3K8.html
+++ b/posts/2019/3QMZ3K8.html
@@ -1335,13 +1335,13 @@
diff --git a/posts/2019/5JY0NS.html b/posts/2019/5JY0NS.html
index 490664cbd3..9390bf6c0e 100644
--- a/posts/2019/5JY0NS.html
+++ b/posts/2019/5JY0NS.html
@@ -367,8 +367,8 @@ 致谢
diff --git a/posts/2020/15F3BA2.html b/posts/2020/15F3BA2.html
index b2c82a394e..7e90120612 100644
--- a/posts/2020/15F3BA2.html
+++ b/posts/2020/15F3BA2.html
@@ -480,8 +480,8 @@ 致谢
diff --git a/posts/2020/15QDG6.html b/posts/2020/15QDG6.html
index 7926a3e771..a89f373897 100644
--- a/posts/2020/15QDG6.html
+++ b/posts/2020/15QDG6.html
@@ -362,13 +362,13 @@
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
Color 颜色对照表。
+序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome +的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
@@ -428,7 +430,7 @@
-
+
@@ -446,7 +448,7 @@
- 在 Winform、WPF 中使用 Font Awesome
+ Color 颜色对照表
@@ -487,14 +489,14 @@
本文字数:
- 865
+ 3.5k
阅读时长 ≈
- 1 分钟
+ 3 分钟
@@ -505,12 +507,10 @@
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
- 在 Winform、WPF 中使用 Font Awesome + Color 颜色对照表
本文字数: - 865 + 3.5k 阅读时长 ≈ - 1 分钟 + 3 分钟
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+ Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html
index 5d0df2a458..702e138c2d 100644
--- a/posts/2019/14CGG7V.html
+++ b/posts/2019/14CGG7V.html
@@ -374,8 +374,8 @@ DgnViewTool
序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome -的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+Color 颜色对照表。
diff --git a/posts/2019/14CGG7V.html b/posts/2019/14CGG7V.html index 5d0df2a458..702e138c2d 100644 --- a/posts/2019/14CGG7V.html +++ b/posts/2019/14CGG7V.html @@ -374,8 +374,8 @@DgnViewTool
致谢
致谢
diff --git a/posts/2020/1C38P4H.html b/posts/2020/1C38P4H.html
index f724fb2b4d..1dda09833b 100644
--- a/posts/2020/1C38P4H.html
+++ b/posts/2020/1C38P4H.html
@@ -369,8 +369,8 @@ 致谢
diff --git a/posts/2020/1PNK91Q.html b/posts/2020/1PNK91Q.html
index 5b7def79d0..e42077dd30 100644
--- a/posts/2020/1PNK91Q.html
+++ b/posts/2020/1PNK91Q.html
@@ -449,8 +449,8 @@ 致谢
diff --git a/posts/2020/25EQ87B.html b/posts/2020/25EQ87B.html
index c6d0acbb5f..1552d7684c 100644
--- a/posts/2020/25EQ87B.html
+++ b/posts/2020/25EQ87B.html
@@ -1143,13 +1143,13 @@ 致谢
diff --git a/posts/2020/28N842C.html b/posts/2020/28N842C.html
index afb811c67a..b18037a2cf 100644
--- a/posts/2020/28N842C.html
+++ b/posts/2020/28N842C.html
@@ -487,13 +487,13 @@ 致谢
diff --git a/posts/2020/2GK4675.html b/posts/2020/2GK4675.html
index 93c99fd7c1..9215b9b8c0 100644
--- a/posts/2020/2GK4675.html
+++ b/posts/2020/2GK4675.html
@@ -391,8 +391,8 @@ 参考
diff --git a/posts/2020/2H8Y4ZN.html b/posts/2020/2H8Y4ZN.html
index 49ed3897cc..8409d87c78 100644
--- a/posts/2020/2H8Y4ZN.html
+++ b/posts/2020/2H8Y4ZN.html
@@ -501,13 +501,13 @@ 致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html
index 4809d5a0db..6363d1e72b 100644
--- a/posts/2020/2RT0R7Q.html
+++ b/posts/2020/2RT0R7Q.html
@@ -359,8 +359,8 @@
diff --git a/posts/2020/317EM2J.html b/posts/2020/317EM2J.html
index d5d1eb3c12..f4bd757a8e 100644
--- a/posts/2020/317EM2J.html
+++ b/posts/2020/317EM2J.html
@@ -511,13 +511,13 @@ Resource And Thanks
diff --git a/posts/2020/35EQCZA.html b/posts/2020/35EQCZA.html
index a0bfb3a2a8..63cf6aea87 100644
--- a/posts/2020/35EQCZA.html
+++ b/posts/2020/35EQCZA.html
@@ -452,13 +452,13 @@ 更多参考资料
diff --git a/posts/2020/37N8G1C.html b/posts/2020/37N8G1C.html
index e4767f2f67..8dca1fa855 100644
--- a/posts/2020/37N8G1C.html
+++ b/posts/2020/37N8G1C.html
@@ -353,13 +353,13 @@
diff --git a/posts/2020/3CGWMS0.html b/posts/2020/3CGWMS0.html
index 462575d538..d008ad66fb 100644
--- a/posts/2020/3CGWMS0.html
+++ b/posts/2020/3CGWMS0.html
@@ -369,8 +369,8 @@ 工具类
致谢
致谢
diff --git a/posts/2020/2RT0R7Q.html b/posts/2020/2RT0R7Q.html index 4809d5a0db..6363d1e72b 100644 --- a/posts/2020/2RT0R7Q.html +++ b/posts/2020/2RT0R7Q.html @@ -359,8 +359,8 @@工具类
Resource And Thanks
详细介绍
diff --git a/posts/2020/MKZP4Q.html b/posts/2020/MKZP4Q.html
index 8b955a9e2b..f850bd9f5f 100644
--- a/posts/2020/MKZP4Q.html
+++ b/posts/2020/MKZP4Q.html
@@ -385,8 +385,8 @@ 一个部件附近元素取得
diff --git a/posts/2020/WXDAQ3.html b/posts/2020/WXDAQ3.html
index 60c590bbd9..2108412de4 100644
--- a/posts/2020/WXDAQ3.html
+++ b/posts/2020/WXDAQ3.html
@@ -374,8 +374,8 @@ 前后端 API 管理
diff --git a/posts/2021/0CYX0R.html b/posts/2021/0CYX0R.html
index 73069255c2..7b2794ef29 100644
--- a/posts/2021/0CYX0R.html
+++ b/posts/2021/0CYX0R.html
@@ -361,8 +361,8 @@
diff --git a/posts/2021/1MAH7MY.html b/posts/2021/1MAH7MY.html
index 7e7c99ecb4..c6c713d174 100644
--- a/posts/2021/1MAH7MY.html
+++ b/posts/2021/1MAH7MY.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
@@ -348,8 +348,8 @@ C#
@@ -368,8 +368,8 @@ C#
前后端 API 管理
diff --git a/posts/2021/2P07T4K.html b/posts/2021/2P07T4K.html
index 9d3f6056d1..8bf2898d6a 100644
--- a/posts/2021/2P07T4K.html
+++ b/posts/2021/2P07T4K.html
@@ -356,13 +356,13 @@
diff --git a/posts/2021/BKEMB5.html b/posts/2021/BKEMB5.html
index d682ad3e2c..5983d54c33 100644
--- a/posts/2021/BKEMB5.html
+++ b/posts/2021/BKEMB5.html
@@ -356,8 +356,8 @@ 弃用 out 值
diff --git a/posts/2023/2W88WG9.html b/posts/2023/2W88WG9.html
index c63d331c48..e42cc55f22 100644
--- a/posts/2023/2W88WG9.html
+++ b/posts/2023/2W88WG9.html
@@ -19,22 +19,20 @@
-
+
-
+
-
-
-
+
@@ -283,9 +281,9 @@
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
diff --git a/tags/C/page/2/index.html b/tags/C/page/2/index.html
index 60e7ea66e2..3ba93fbe86 100644
--- a/tags/C/page/2/index.html
+++ b/tags/C/page/2/index.html
@@ -225,8 +225,8 @@ C#
@@ -245,8 +245,8 @@ C#
弃用 out 值
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -305,16 +303,16 @@
项目创建及任务安排
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml
index b5d008ced7..af345c1288 100644
--- a/search.xml
+++ b/search.xml
@@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htm
the video form:
https://www.youtube.com/watch?v=d0wV9EC3t14
+]]>
+
+ English
+
+
+ English
+
+
+
+ American accent practice
+ /posts/2020/15QDG6.html
+ There are some experience in my studying.
+
+
+辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒouk məʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone who / sʌmwan u /
+can 一般 /kən/
+
]]>
English
@@ -2003,36 +2033,6 @@ sometimes, pop music。
the video form:
https://www.youtube.com/watch?v=X3aOsOUM06c&list=PL7sOfomcE2Tdq0N-_nb7tvdm4S5gBEr0N
-]]>
-
- English
-
-
- English
-
-
-
- American accent practice
- /posts/2020/15QDG6.html
- There are some experience in my studying.
-
-
-辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒouk məʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone who / sʌmwan u /
-can 一般 /kən/
-
]]>
English
@@ -4917,6 +4917,73 @@ ElementPropertiesSetter,具体代码如下:
致谢
解决思路来自优先社区:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ MS中曲线总结
+ /posts/2020/37N8G1C.html
+ MS
+二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
+API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
+MS 中原生的 API 实现我们自己想要的功能。
+本文对常用的 ms 中的线条使用进行总结。
+
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
+
+ 优先社区二次开发学习
+ /posts/2020/MKZP4Q.html
+ 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
+
+command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
+是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
+表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
+针对元素描述符:mdlElmdscr_computeRange
+针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述:
+首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
+但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
+然后COPY到另一个文件中去。
+
+想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
+可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
+在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
+yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
+Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>
Bentley
@@ -9348,73 +9415,6 @@ API,有时候要实现一个功能,可能需要将曲线在多种类型中
MS 中原生的 API 实现我们自己想要的功能。
本文对常用的 ms 中的线条使用进行总结。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- MS中曲线总结
- /posts/2020/37N8G1C.html
- MS
-二开中,可能会处理很多的曲线,比如对曲线进行偏移,求交点,延长等等。每一种曲线,有它的特点和相应的
-API,有时候要实现一个功能,可能需要将曲线在多种类型中进行相互转化,从而利用
-MS 中原生的 API 实现我们自己想要的功能。
-本文对常用的 ms 中的线条使用进行总结。
-
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
-
- 优先社区二次开发学习
- /posts/2020/MKZP4Q.html
- 最近发现优先社区二开版块中有很多精华的帖子,于是计划进行一一拜读,将所得记于此。
-
-command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber
-是一个长整型数,如0x01020345。其中的01(十六进制的前面两位)
-表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数:
-针对元素描述符:mdlElmdscr_computeRange
-针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述:
-首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。
-但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。
-然后COPY到另一个文件中去。
-
-想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。
-可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem;
ElementRef elemRef= dgnFileObj_findElemByID(mdlModelRef_getDgnFile (ACTIVEMODEL) , 42078 , FALSE);
elementRef_getElement(elemRef, &elem, elementRef_getElemSize( elemRef ));
mdlFence_fromShape( &elem );
mdlParams_setLock (0, ACTIVELOCK_FENCEVOID);
mdlParams_setLock (1, ACTIVELOCK_FENCEOVERLAP);
mdlState_startFenceCommand(FenceDeal, NULL, NULL, NULL, NULL, NULL, FENCE_NO_CLIP);
mdlFence_process( NULL ); mdlFence_clear( TRUE );
-在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int
-yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg)
{
ULong filePos;
DgnModelRefP currFileP;
MSElement el;
filePos = mdlElement_getFilePos (FILEPOS_CURRENT, &currFileP);
mdlElement_read (&el,currFileP,filePos);
return SUCCESS;
}
-Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>
Bentley
@@ -9477,6 +9477,54 @@ href="/2020/09/20/MDL开发中如何创建makefile文件/#">MDL开发中如何
MDL
+
+ 元素的复制
+ /posts/2021/2VBGV0Z.html
+ 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
+
+Element 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnPlatformNET.dll
+Bentley.DgnPlatformNET
+
+
+
+//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
+SolidKernelEntity 克隆
+
+
+
+程序集
+命名空间
+
+
+
+
+Bentley.DgnDisplayNet.dll
+Bentley.DgnPlatformNET
+
+
+
+// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
+CurveVector 克隆
+调用对象的 Clone()
方法。
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+
+
MDL开发中如何创建makefile文件
/posts/2020/353AZ4N.html
@@ -9621,54 +9669,6 @@ bmake Utility
MDL
-
- 元素的复制
- /posts/2021/2VBGV0Z.html
- 在使用中,经常需要对 Benlety 中的对象进行克隆,以下进行总结。
-
-Element 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnPlatformNET.dll
-Bentley.DgnPlatformNET
-
-
-
-//复制元素
using (ElementCopyContext cc = new ElementCopyContext(dgnModel))
{
cc.WriteElements = false; //调整复制上下文环境不要立即写入元素
Element _cloneEle = cc.DoCopy(_el);
ElementPropertiesSetter eps = new ElementPropertiesSetter();
eps.SetColor(lineColor);
eps.SetWeight(LineWeight);
eps.Apply(_cloneEle); //设置颜色
_cloneEle.AddToModel();
return _cloneEle;
}
-SolidKernelEntity 克隆
-
-
-
-程序集
-命名空间
-
-
-
-
-Bentley.DgnDisplayNet.dll
-Bentley.DgnPlatformNET
-
-
-
-// 复制 SolidKernelEntity
CopyEntity(out SolidKernelEntity entityOut, SolidKernelEntity entityIn)
-CurveVector 克隆
-调用对象的 Clone()
方法。
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
-
-
元素间相互转换
/posts/2021/1KH1955.html
@@ -9733,6 +9733,26 @@ bmake Utility
Bentley 二次
+
+ MS 开发常用 DLL 引用配置推荐
+ /posts/2022/26E0BYF.html
+ 本文收集了在 MS 二次开发的过程中常用的 DLL
+引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
+
+Command 配置
+<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
+引用列表
+<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
+]]>
+
+ Bentley
+ Develop
+
+
+ Bentley二次开发
+ Bentley
+
+
文章收集
/posts/2022/3NG4YVW.html
@@ -9758,26 +9778,6 @@ href="https://mp.weixin.qq.com/s/a-965kgZY7G6c5qwDpOLUQ">参数化约束(一
Develop
-
- MS 开发常用 DLL 引用配置推荐
- /posts/2022/26E0BYF.html
- 本文收集了在 MS 二次开发的过程中常用的 DLL
-引用配置,方便今后开辟新项目直接拷贝使用,在使用的过程中,会根据需要,逐渐添加。
-
-Command 配置
-<ItemGroup>
<EmbeddedResource Include="AddinAndKeyIn\ExtendedCommands.xml">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
-引用列表
-<Reference Include="Bentley.DgnDisplayNet">
<HintPath>$(Microstation)\Bentley.DgnDisplayNet.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.DgnPlatformNET">
<HintPath>$(Microstation)\Bentley.DgnPlatformNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.EC.Persistence3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.EC.Persistence3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.Interop3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.Interop3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects.MixedMode3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECObjects3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECObjects3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.ECSystem3">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.ECSystem3.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.General.1.0">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.General.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Platform">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Platform.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.UI">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.UI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Windowing">
<HintPath>$(Microstation)\Assemblies\ECFramework\Bentley.Windowing.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<HintPath>$(Microstation)\Bentley.GeometryNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Common">
<HintPath>$(Microstation)\Bentley.GeometryNET.Common.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<HintPath>$(Microstation)\Bentley.GeometryNET.Structs.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.Interop.MicroStationDGN">
<HintPath>$(Microstation)\Assemblies\Bentley.Interop.MicroStationDGN.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Interfaces.1.0">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Interfaces.1.0.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.Ribbon">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.Ribbon.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WinForms.Controls">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WinForms.Controls.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.MicroStation.WPF">
<HintPath>$(Microstation)\Assemblies\Bentley.MicroStation.WPF.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintAPI">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintAPI.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintDefinitions">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintDefinitions.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintEngine">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintEngine.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrinterConfigurationEditor">
<HintPath>$(Microstation)\Assemblies\Bentley.PrinterConfigurationEditor.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintFoundation">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintFoundation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.PrintManager">
<HintPath>$(Microstation)\Assemblies\Bentley.PrintManager.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModelNET.Formats">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModelNET.Formats.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Bentley.TerrainModel.ElementTemplate">
<HintPath>$(Microstation)\Assemblies\Bentley.TerrainModel.ElementTemplate.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="ustation">
<HintPath>$(Microstation)\ustation.dll</HintPath>
<private>False</private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(Microstation)\Assemblies\Newtonsoft.Json.dll</HintPath>
<private>False</private>
</Reference>
-]]>
-
- Bentley
- Develop
-
-
- Bentley二次开发
- Bentley
-
-
MS To Learn
/posts/2023/1H5NPNF.html
@@ -9940,6 +9940,34 @@ alt="image-20220509115801614" />
CONNECTION Client
,重新打开。可以多试几次
使用代理
+]]>
+
+ Bentley
+ Problems
+
+
+ Bentley
+ Bentley问题处理
+ galens
+
+
+
+ ORD安装提示Failed copy payload xx的解决办法
+ /posts/2023/304FHXE.html
+
+
+如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
+
+由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
+参考:
+
]]>
Bentley
@@ -9973,34 +10001,6 @@ alt="image-20220509162253268" />
VBA
rejected the OpenRoads Designer Application Object
-]]>
-
- Bentley
- Problems
-
-
- Bentley
- Bentley问题处理
- galens
-
-
-
- ORD安装提示Failed copy payload xx的解决办法
- /posts/2023/304FHXE.html
-
-
-如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
-参考:
-
]]>
Bentley
@@ -10430,6 +10430,33 @@ keyin 命令:
galens
+
+ 3dmax 文件如何导入到 dgn 中
+ /posts/2022/29WK0R3.html
+ 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
+
+
+转为 fbx
+导出为 3ds 文件
+
+在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
+]]>
+
+ Bentley
+ UseSkill
+
+
+ Bentley
+ UseSkill
+ galens
+
+
如何删除 ORD 中的工作空间
/posts/2022/T3NMZE.html
@@ -10465,33 +10492,6 @@ alt="image-20220314194812625" />
galens
-
- 3dmax 文件如何导入到 dgn 中
- /posts/2022/29WK0R3.html
- 如果需要将 3dmax 模型文件导入到 dgn 中,可以有以下方法:
-
-
-转为 fbx
-导出为 3ds 文件
-
-在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
-]]>
-
- Bentley
- UseSkill
-
-
- Bentley
- UseSkill
- galens
-
-
ORD 及 swBentley 安装教程
/posts/2022/3EFH36D.html
@@ -11910,6 +11910,21 @@ alt="类关系图" />
C#
+
+ 编程风格指南
+ /posts/2022/1BXSKSD.html
+ 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+
+]]>
+
+ Develop
+ DesignPattern
+
+
+ 设计模式
+ C#
+
+
23 个设计模式速览
/posts/2022/3HRNXN7.html
@@ -12536,18 +12551,52 @@ Pattern
- 编程风格指南
- /posts/2022/1BXSKSD.html
- 本文总结了 C# 中的编程风格,使编写的代码更加优雅。
+ 在 Winform、WPF 中使用 Font Awesome
+ /posts/2019/1TFVRP.html
+ 序
+今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
+的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+
+Install-Package FontAwesome.Sharp
+
+功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+
+- 在 Winform 上可以使用下列类
+
+- IconButton,
+- IconToolStripButton,
+- IconDropDownButton,
+- IconMenuItem,
+- IconPictureBox 或者
+- IconSplitButton
+
+- 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
+var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
+WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+
+- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
+- 图片来源于网络
+
]]>
Develop
- DesignPattern
+ DotNET
- 设计模式
C#
+ .NET
@@ -13569,55 +13618,6 @@ Pattern
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在 Winform、WPF 中使用 Font Awesome
- /posts/2019/1TFVRP.html
- 序
-今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome
-的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
-
-项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
-
-Install-Package FontAwesome.Sharp
-
-功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
-
-- 在 Winform 上可以使用下列类
-
-- IconButton,
-- IconToolStripButton,
-- IconDropDownButton,
-- IconMenuItem,
-- IconPictureBox 或者
-- IconSplitButton
-
-- 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
-var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms
var image = IconChar.BatteryEmpty.ToImageSource(Brushes.Black, 16); // WPF
var customFontBitmap = MyCustomFont.ToBitmap(MyEnum.SomeIcon, 16, Color.Black); // Windows Forms, custom font
var customFontImage = MyCustomFont.ToImageSource(MyEnum.SomeIcon, Brushes.Black, 16); // WPF, custom font
-WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
-
-- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp
-- 图片来源于网络
-
]]>
Develop
@@ -13648,6 +13648,175 @@ href="https://github.com/awesome-inc/FontAwesome.Sharp">https://github.com/aweso
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中实现动态的下拉选项
+ /posts/2020/3GJFFVV.html
+ 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
+(TypeConverterAttribute) 来自定义下拉选项。
+这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+
+此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
+在 GetStandardValues 方法中,会传递下来一个 context, 而
+context.Instance
+就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ PropertyGrid 中只显示部分属性
+ /posts/2020/35EQCZA.html
+ 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
+PropertyGrid控件就是Visual
+Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+
+普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
+属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给
+propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
+PropertyGrid 中用到的特性:
+
+DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
+"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
+get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
+访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
+
+如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
+自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
+下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
+显示结果:
+
+实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
+我们实现了下拉框类型转换器,但该如何使用呢?
+
+方法一:在属性上方添加标记
+[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
+使用方法:
+
+在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
+typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
+效果图如下:
+
+自定义要显示的属性
+PropertyGrid
+默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+
+- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
+[Browsable(false)]
+- 想通过自定义的 Attribute 来控制属性的显示
+
+这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
+实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
+致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized
+display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+
+
+]]>
+
+ Develop
+ DotNET
+
+
+ C#
+ .NET
+
+
+
+ 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
+ /posts/2020/16SCXPH.html
+ 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
+程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
+
+
+解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+
+第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
+在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
+特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>
Develop
@@ -15369,175 +15538,6 @@ href="https://blog.csdn.net/binnygoal/article/details/79557746">非常完善的L
Log4net
-
- PropertyGrid 中只显示部分属性
- /posts/2020/35EQCZA.html
- 最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。
-PropertyGrid控件就是Visual
-Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
-
-普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject
-属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给
-propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在
-PropertyGrid 中用到的特性:
-
-DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给
-"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有
-get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get
-访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
-
-如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
-自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类
public class PropertyManageCls : CollectionBase, ICustomTypeDescriptor
{
public void Add(Property value)
{
int flag=-1;
if (value != null)
{
if (base.List.Count>0)
{
IList <Property> mList=new List<Property>();
for (int i = 0; i < base.List.Count; i++)
{
Property p = base.List[i] as Property;
if (value.Name == p.Name)
{
flag = i;
}
mList.Add(p);
}
if (flag == -1)
{
mList.Add(value);
}
base.List.Clear();
foreach (Property p in mList)
{
base.List.Add(p);
}
}
else
{
base.List.Add(value);
}
}
}
public void Remove(Property value)
{
if(value!=null&&base.List.Count>0)
base.List.Remove(value);
}
public Property this[int index]
{
get
{
return (Property)base.List[index];
}
set
{
base.List[index] = (Property)value;
}
}
#region ICustomTypeDescriptor 成员
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count];
for (int i = 0; i < this.Count; i++)
{
Property prop = (Property)this[i];
newProps[i] = new CustomPropertyDescriptor(ref prop, attributes);
}
return new PropertyDescriptorCollection(newProps);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
#endregion
}
//属性类
public class Property
{
private string _name=string.Empty;
private object _value=null;
private bool _readonly=false;
private bool _visible=true;
private string _category=string.Empty;
TypeConverter _converter=null;
object _editor = null;
private string _displayname = string.Empty;
public Property(string sName, object sValue)
{
this._name = sName;
this._value = sValue;
}
public Property(string sName, object sValue, bool sReadonly, bool sVisible)
{
this._name = sName;
this._value = sValue;
this._readonly = sReadonly;
this._visible = sVisible;
}
public string Name //获得属性名
{
get
{
return _name;
}
set
{
_name=value;
}
}
public string DisplayName //属性显示名称
{
get
{
return _displayname;
}
set
{
_displayname = value;
}
}
public TypeConverter Converter //类型转换器,我们在制作下拉列表时需要用到
{
get
{
return _converter;
}
set
{
_converter = value;
}
}
public string Category //属性所属类别
{
get
{
return _category;
}
set
{
_category = value;
}
}
public object Value //属性值
{
get
{
return _value;
}
set
{
_value=value;
}
}
public bool ReadOnly //是否为只读属性
{
get
{
return _readonly;
}
set
{
_readonly = value;
}
}
public bool Visible //是否可见
{
get
{
return _visible;
}
set
{
_visible = value;
}
}
public virtual object Editor //属性编辑器
{
get
{
return _editor;
}
set
{
_editor = value;
}
}
}
public class CustomPropertyDescriptor : PropertyDescriptor
{
Property m_Property;
public CustomPropertyDescriptor(ref Property myProperty, Attribute[] attrs)
: base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
#region PropertyDescriptor 重写方法
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return null;
}
}
public override object GetValue(object component)
{
return m_Property.Value;
}
public override string Description
{
get
{
return m_Property.Name;
}
}
public override string Category
{
get
{
return m_Property.Category;
}
}
public override string DisplayName
{
get
{
return m_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
}
}
public override bool IsReadOnly
{
get
{
return m_Property.ReadOnly;
}
}
public override void ResetValue(object component)
{
//Have to implement
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
m_Property.Value = value;
}
public override TypeConverter Converter
{
get
{
return m_Property.Converter;
}
}
public override Type PropertyType
{
get { return m_Property.Value.GetType(); }
}
public override object GetEditor(Type editorBaseType)
{
return m_Property.Editor==null? base.GetEditor(editorBaseType):m_Property.Editor;
}
#endregion
}
-下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property("ID", "1", false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pmc.Add(pp);
propertyGrid1.SelectObject=pmc;
-显示结果:
-
-实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器
public class DropDownListConverter : StringConverter
{
object[] m_Objects;
public DropDownListConverter(object[] objects)
{
m_Objects = objects;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;//true下拉框不可编辑
}
public override
System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活性有很大影响
return new StandardValuesCollection(m_Objects);
// 此处一般是根据 context 中传递下来的 Instance,从中获取下拉的条件,动态生成下拉选项
}
}
-我们实现了下拉框类型转换器,但该如何使用呢?
-
-方法一:在属性上方添加标记
-[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog();
dialog.AddExtension = false;
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
-使用方法:
-
-在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),
-typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
-效果图如下:
-
-自定义要显示的属性
-PropertyGrid
-默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
-
-- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为
-[Browsable(false)]
-- 想通过自定义的 Attribute 来控制属性的显示
-
-这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
-实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor
{
#region ICustomTypeDescriptor
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
// 修改此属性,进行展示
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
// 特别注意,此处的 true 代表不使用当前类的 GetProperties 方法来获取属性,默认为 false,这会导致无限循环,从而导致栈溢出
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptor[] properties = pdc.Cast<PropertyDescriptor>().Where(item => item.Attributes.Cast<Attribute>().Any(itemA => itemA is BrowsableAttribute ba && ba.Browsable)).ToArray();
return new PropertyDescriptorCollection(properties);
}
#endregion
}
-致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized
-display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
-
-
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- PropertyGrid 中实现动态的下拉选项
- /posts/2020/3GJFFVV.html
- 在使用 PropertyGrid 控件中,有时候我们在属性的上面添加类型转换特性
-(TypeConverterAttribute) 来自定义下拉选项。
-这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
-
-此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter
{
private List<string> _diameters = new List<string>() { "φ8","φ10","φ12", "φ14", "φ16", "φ18", };
//true enable,false disable
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if(context!=null && context.Instance is ISwRebarProperty rebar)
{
_diameters = swOpenRoadsSDK.ParseSpecificationXml.Instance.GetSpecifications(rebar.FeatureName);
}
return new StandardValuesCollection(_diameters.ToArray()); //编辑下拉框中的items
}
//true: disable text editting. false: enable text editting;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
-在 GetStandardValues 方法中,会传递下来一个 context, 而
-context.Instance
-就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
-
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- /posts/2020/16SCXPH.html
- 用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform
-程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。
-
-
-解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
-
-第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
-在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
-特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>
-
- Develop
- DotNET
-
-
- C#
- .NET
-
-
LiteDB中id的理解与使用
/posts/2021/2NDY00Q.html
@@ -15719,6 +15719,31 @@ https://icons8.cn/illustrations/style--pale
FrontEnd
+
+ Js 开发常用 npm 包合集
+ /posts/2023/1KT0Y3S.html
+ 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
+npm 包。方便在后续项目中应用。
+
+Excel
+
+参考:
+
+]]>
+
+ Develop
+ Javascript
+
+
+ Javasript
+
+
色彩搭配方法
/posts/2022/2K21HCS.html
@@ -15938,31 +15963,6 @@ href="https://baijiahao.baidu.com/s?id=1678943509942368945">配色不要慌!
galens
-
- Js 开发常用 npm 包合集
- /posts/2023/1KT0Y3S.html
- 本文根据日常开发需求,通过对比现有各个包,总结出在个人认知范围内认为最为合适的
-npm 包。方便在后续项目中应用。
-
-Excel
-
-参考:
-
-]]>
-
- Develop
- Javascript
-
-
- Javasript
-
-
邮件群发助手文档
/posts/2020/2QMK677.html
@@ -16423,6 +16423,22 @@ name,则命名为空,不能指定参数名来引用。
galens
+
+ RESTful API 规范
+ /posts/2020/K6BTSD.html
+ HTTP状态码:
+摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>
+
+ Develop
+ Web
+
+
+ Web
+ RESTful
+
+
最全最详细 http 状态码介绍
/posts/2020/25EQ87B.html
@@ -17230,22 +17246,6 @@ href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/504">504HTTP
-
- RESTful API 规范
- /posts/2020/K6BTSD.html
- HTTP状态码:
-摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>
-
- Develop
- Web
-
-
- Web
- RESTful
-
-
网络编程入门
/posts/2020/WXDAQ3.html
@@ -17490,6 +17490,28 @@ alt="img" />
生活感悟
+
+ 游沅江有感
+ /posts/2017/HPBWTD.html
+ 今天是2017年4月15日。
+本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
+分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+
+到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
老卓的礼物
/posts/2017/05KG8X.html
@@ -17504,28 +17526,6 @@ alt="img" />
事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 游沅江有感
- /posts/2017/HPBWTD.html
- 今天是2017年4月15日。
-本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30
-分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
-
-到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>
Inspiration
@@ -17577,6 +17577,32 @@ alt="图片来自网络" />
梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 生活感悟
+
+
+
+ 因为匆匆
+ /posts/2017/3C2G7GH.html
+ 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
+我想,大概是我们走得太快,时间也跟不上了。
+
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+
]]>
Inspiration
@@ -17609,29 +17635,25 @@ alt="图片来自网络" />
- 因为匆匆
- /posts/2017/3C2G7GH.html
- 又是一次天色渐晚,吃过晚饭,听着音乐,打发闲着的时间,只有在这一刻,我才感觉到,光阴是在身边流淌。工作的时候,时间逝得很快,快得都分不出来是时间超过了我们,还是我们越过了时间。
-我想,大概是我们走得太快,时间也跟不上了。
+ 想念挚友
+ /posts/2017/1AJP2Y0.html
+ 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
-
+去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
2017年
- 生活感悟
+ 散文
@@ -17649,28 +17671,6 @@ alt="图片" />
工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
-
- 想念挚友
- /posts/2017/1AJP2Y0.html
- 三毛说:“最好的爱情就是相处不累”。我觉得这句话也可以用来形容友谊,最好的友情也便是相处不累。
-
-去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>
Inspiration
@@ -17727,6 +17727,32 @@ alt="图片" />3年前,初听到西塘这个名字的时候,便烙在了灵
生活感悟
+
+ 七月与安生
+ /posts/2017/2P24YP8.html
+ 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
+
+七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
+“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>
+
+ Inspiration
+ 2017年
+
+
+ 散文
+
+
无邪
/posts/2017/331FR19.html
@@ -17756,32 +17782,6 @@ alt="图片" />
生活感悟
-
- 七月与安生
- /posts/2017/2P24YP8.html
- 有一对闺蜜,一个叫七月,另一个是安生,七月安静,在大人面前表现得很乖,安生开朗,七月妈妈说她什么都好,只是缺了点运气。安生没考上大学,出去闯荡,换了很多男朋友,最后找了个老实人结了婚,过上了相夫教子的幸福生活,七月和男友同一所大学,毕业后谈婚论嫁,所有人都认为他们是最合适的一对,会很幸福,但是他不够爱她,在结婚的时候离去,七月终于找到借口出去闯荡。
-
-七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高
-“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>
-
- Inspiration
- 2017年
-
-
- 散文
-
-
兰州
/posts/2018/202BKMX.html
@@ -18266,50 +18266,6 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
-
- 让心驰骋在木兰草原之上
- /posts/2021/8Z3TAG.html
- 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
-合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
-“天似穹庐,笼盖四野”
-的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>
-
- Inspiration
- 2021年
-
-
- 散文
- 团建
-
-
-
- 浮沉喧嚣不惊觉,一朝醒来入凡心
- /posts/2023/1N11HYC.html
- 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
-
-新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022
-年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>
-
- Inspiration
- 2023年
-
-
- 散文
- 心有所感
-
-
孙少安的人格魅力
/posts/2020/QQM15G.html
@@ -18364,6 +18320,50 @@ alt="你好,2020" /> ## 你好,新年;你好,2020
散文
+
+ 让心驰骋在木兰草原之上
+ /posts/2021/8Z3TAG.html
+ 2021年11月27日,设计四所、BIM中心和经营部在木兰草原联合举办了具有草原风情的团建活动。滑草、骑马、射箭,不论老少,玩得不亦乐乎。
+合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了
+“天似穹庐,笼盖四野”
+的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>
+
+ Inspiration
+ 2021年
+
+
+ 散文
+ 团建
+
+
+
+ 浮沉喧嚣不惊觉,一朝醒来入凡心
+ /posts/2023/1N11HYC.html
+ 很长一段时间没有提笔了,今日突然心有所感,借此机会便将脑中那飘渺的灵感记录下来,摘一段时光,以供未来思忆。
+
+新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022
+年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>
+
+ Inspiration
+ 2023年
+
+
+ 散文
+ 心有所感
+
+
为她守护一束桅子花开
/posts/2023/21AX3JT.html
@@ -18482,6 +18482,117 @@ alt="image-20230717005034407" />
galens
+
+ 01-建筑结构可靠性设计
+ /posts/2022/2XR0S9K.html
+ 通过学习本章,心有所得,总结如下。
+
+设计基准期计算
+
+
+超越概率 = 1 - p
+
+建筑结构分项系数
+
+
+
+
+
+
+
+
+
+系数
+说明
+作用效应对承载能力不利时
+作用效应对承载能力有利时
+
+
+
+
+\(\gamma_G\)
+永久作用
+1.3
+<=1.0
+
+
+\(\gamma_P\)
+预应力作用
+1.3
+<=1.0
+
+
+\(\gamma_Q\)
+可变作用
+1.5
+0
+特别注意,有利时,可变荷载的分项系数为 0
+
+
+
+基本组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+标准组合计算
+如果组合中,有两个及以上的可变荷载,需要
+取最大的两个分别作为主导荷载
+进行计算。其计算公式如下:
+
+当有 2 个及以上可变荷载时,快速计算公式如下:
+
+求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+
+- 同时组合所有可能参与的活载
+- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
+
+最小值
+如果题目中让求内力的最小值时,则应:
+
+- 组合时,尽可能少地考虑活载的组合
+
+其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
+要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>
+
+ RegisteredStructure
+ 01-建筑结构可靠性设计和作用
+
+
+ 一注结构专业
+ 考试
+ galens
+
+
《非暴力沟通》读书笔记
/posts/2023/3KQXHMP.html
@@ -18625,117 +18736,6 @@ alt="image-20230717005034407" />
读书笔记
-
- 01-建筑结构可靠性设计
- /posts/2022/2XR0S9K.html
- 通过学习本章,心有所得,总结如下。
-
-设计基准期计算
-
-
-超越概率 = 1 - p
-
-建筑结构分项系数
-
-
-
-
-
-
-
-
-
-系数
-说明
-作用效应对承载能力不利时
-作用效应对承载能力有利时
-
-
-
-
-\(\gamma_G\)
-永久作用
-1.3
-<=1.0
-
-
-\(\gamma_P\)
-预应力作用
-1.3
-<=1.0
-
-
-\(\gamma_Q\)
-可变作用
-1.5
-0
-特别注意,有利时,可变荷载的分项系数为 0
-
-
-
-基本组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-标准组合计算
-如果组合中,有两个及以上的可变荷载,需要
-取最大的两个分别作为主导荷载
-进行计算。其计算公式如下:
-
-当有 2 个及以上可变荷载时,快速计算公式如下:
-
-求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
-
-- 同时组合所有可能参与的活载
-- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值
-
-最小值
-如果题目中让求内力的最小值时,则应:
-
-- 组合时,尽可能少地考虑活载的组合
-
-其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
-要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>
-
- RegisteredStructure
- 01-建筑结构可靠性设计和作用
-
-
- 一注结构专业
- 考试
- galens
-
-
楼面和屋面活荷载
/posts/2022/10AW0YR.html
@@ -20993,112 +20993,6 @@ alt="https://min.io/" />
minio
-
- 使用 OfficeToolPlus 安装和激活 Office
- /posts/2023/3H07Q23.html
- Office Tool Plus
-是一个强大且实用的 Office 部署工具。
-Office Tool Plus 基于 Office
-部署工具 和 OSPP
-制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
-Office,当然,你也可以使用 Office Tool Plus
-内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
-
-系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
-macOS)。
-
-
-若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool
-Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
-
-Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-选择【部署】
-选择安装 office 版本
-
-
-建议选择带有年份的升级版本,比如 Office 2021
-企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
-Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
-
-安装详细步骤如下:
-
-展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS
-服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
-将激活服务器网址输入到 KMS
-主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
-参考
-
-]]>
-
- Software
- Office
-
-
- Software
- Office
- galens
-
-
一文带你了解Navicat中MongoDB查询的高级用法
/posts/2022/1C3RDWC.html
@@ -21280,6 +21174,112 @@ MongoDB
Navicat
+
+ 使用 OfficeToolPlus 安装和激活 Office
+ /posts/2023/3H07Q23.html
+ Office Tool Plus
+是一个强大且实用的 Office 部署工具。
+Office Tool Plus 基于 Office
+部署工具 和 OSPP
+制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载
+Office,当然,你也可以使用 Office Tool Plus
+内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+
+系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或
+macOS)。
+
+
+若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool
+Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+
+Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
+
+选择【部署】
+选择安装 office 版本
+
+
+建议选择带有年份的升级版本,比如 Office 2021
+企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
+Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+
+安装详细步骤如下:
+
+展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS
+服务器,推荐使用检测成功次数较多的服务器,比如:win.kms.pub
+将激活服务器网址输入到 KMS
+主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
+参考
+
+]]>
+
+ Software
+ Office
+
+
+ Software
+ Office
+ galens
+
+
Powershell7 实用插件集
/posts/2023/1N5WRFM.html
@@ -22168,9 +22168,9 @@ href="https://dotnet.microsoft.com/download/dotnet-framework">单击跳转下载
iEPC 设计协同使用教程
/posts/2023/2W88WG9.html
-
-image-20230809125317359
+
+image-20230916175043880
iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
image-20230809130745354
协同流程
-
+
详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />
galens
-
- Bentley中在.NET下监听元素双击事件
- /posts/2021/2JZQM2W.html
- 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
-
-在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
-// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
-
-程序使用了 COM 接口,所以需要的引入
-Bentley.MicroStation.dll,COM接口位于
-Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
-
-
-
- Microstation 中监听元素修改事件
- /posts/2022/1GXJ3PN.html
- 在进行 Microstation
-二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
-上注册 ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
-获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
-public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
-获取新元素
-属性 NewElement
代表新元素。
-获取旧元素
-参考
-
-]]>
-
- Bentley
- Develop
- 事件
-
-
- Bentley二次开发
- Bentley
-
-
MS 关于 Fraction 的使用说明
/posts/2020/4JEF7M.html
@@ -25212,6 +25152,40 @@ href="https://www.yuque.com/bentleysystems/ms/gw1qex">几何继承关系层次
Bentley
+
+ MS中各个对象获取的DTransform含义
+ /posts/2022/1RDA3BV.html
+ 在进行矩阵转换时,谨记如下公式: \[
+\begin{aligned}
+M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
+E \cdot P_{world} &= M_{local} \cdot P_{local} \\
+\therefore P_{world} &= M_{local} \cdot P_{local} \\
+\end{aligned}
+\] M
+可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
+在理解 MS 中各个对象返回的 DTransform
+含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+
+DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
+planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
+的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
+上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>
+
+ Bentley
+ Develop
+ 几何变换
+
+
+ Bentley
+ 二次开发
+
+
由浅入深地理解样条曲线
/posts/2022/1CPW2GG.html
@@ -25909,40 +25883,6 @@ Curves: Closed Curves
galens
-
- MS中各个对象获取的DTransform含义
- /posts/2022/1RDA3BV.html
- 在进行矩阵转换时,谨记如下公式: \[
-\begin{aligned}
-M_{world} \cdot P_{world} &= M_{local} \cdot P_{local} \\
-E \cdot P_{world} &= M_{local} \cdot P_{local} \\
-\therefore P_{world} &= M_{local} \cdot P_{local} \\
-\end{aligned}
-\] M
-可以叫做坐标系的度量矩阵,将某个坐标系统转到另一个坐标系,是在原坐标系的值上左乘新坐标系度量矩阵的逆。
-在理解 MS 中各个对象返回的 DTransform
-含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
-
-DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
-planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld
-的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值
public static DTransform3d FromOriginAndColumns(DPoint3d origin, DVector3d xVector, DVector3d yVector, DVector3d zVector)
-上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>
-
- Bentley
- Develop
- 几何变换
-
-
- Bentley
- 二次开发
-
-
求解矩阵的逆
/posts/2022/3MW6BH0.html
@@ -26125,6 +26065,123 @@ href="https://www.zhihu.com/question/21080171">点乘和叉乘的区别是什么
galens
+
+ Bentley工程属性入门
+ /posts/2022/33P3D91.html
+ 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
+保存自己的数据。
+
+序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
+Bentley 采用 XAttribute 的方式在 dgn
+文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
+经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
+(Engineering Content Framework ),通过这套方案
+Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+
+- EC
+- ItemType
+- XAttribute
+
+EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+
+
+
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+ EC
+
+
+
+ 给元素添加自定义数据的几种方式
+ /posts/2023/283FNHQ.html
+ 参考:Addin给元素添加自定义Linkage数据
+]]>
+
+ Bentley
+ Develop
+ 数据存储
+
+
+ Bentley
+
+
+
+ Bentley中在.NET下监听元素双击事件
+ /posts/2021/2JZQM2W.html
+ 在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。
+
+在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
+// 该类继承 Bentley.MstnPlatformNET.AddIn
protected override int Run(string[] commandLine)
{
// 其它操作
// ...
// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}
// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}
return null;
}
+
+程序使用了 COM 接口,所以需要的引入
+Bentley.MicroStation.dll,COM接口位于
+Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+
+
+
+ Microstation 中监听元素修改事件
+ /posts/2022/1GXJ3PN.html
+ 在进行 Microstation
+二次开发时,有时候需要监听元素的修改事件,实现联动修改,可以在 Addin
+上注册 ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
+获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
+public enum ChangeTrackKind
{
Delete = 1,
Add = 2,
Modify = 3,
ModifyFence = 5,
Mark = 7,
ModelAdd = 9,
ModelDelete = 10,
AddXAttribute = 11,
DeleteXAttribute = 12,
ModifyXAttribute = 13,
ReplaceXAttribute = 14
}
+获取新元素
+属性 NewElement
代表新元素。
+获取旧元素
+参考
+
+]]>
+
+ Bentley
+ Develop
+ 事件
+
+
+ Bentley二次开发
+ Bentley
+
+
如何调用 Microstation 的消息管理器
/posts/2022/1NF37FV.html
@@ -26263,63 +26320,6 @@ href="https://communities.bentley.com/communities/other_communities/chinafirst/f
galens
-
- Bentley工程属性入门
- /posts/2022/33P3D91.html
- 本文主要介绍在 Bentley 平台上进行二次开发时,如何向 dgn
-保存自己的数据。
-
-序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初
-Bentley 采用 XAttribute 的方式在 dgn
-文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley
-经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework
-(Engineering Content Framework ),通过这套方案
-Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
-
-- EC
-- ItemType
-- XAttribute
-
-EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
-
-
-
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
- EC
-
-
-
- 给元素添加自定义数据的几种方式
- /posts/2023/283FNHQ.html
- 参考:Addin给元素添加自定义Linkage数据
-]]>
-
- Bentley
- Develop
- 数据存储
-
-
- Bentley
-
-
Bentley 程序集学习
/posts/2022/5X1QK2.html
@@ -28710,98 +28710,6 @@ Core 中的路由 | Microsoft Learn
ASP.NET
Core Web API 中控制器操作的返回类型
-]]>
-
- Develop
- DotNET
- DotNetCore
-
-
- .NET Core
-
-
-
- .NET Core 中使用配置文件
- /posts/2023/D4VJ6Q.html
- ASP.NET Core
-中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
-
-环境设置文件,appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
。
-设置文件,例如 appsettings.json
-
-
-配置示例
-以 appsettings.json 配置为例,定义如下:
-{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
-加载顺序
-默认的 JsonConfigurationProvider
-会按以下顺序加载配置:
-
-appsettings.json
-appsettings.{Environment}.json
-例如,appsettings.Production.json
和
-appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
-加载的。 有关详细信息,请参阅在
-ASP.NET Core 中使用多个环境。
-
-后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
-数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
-public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
-通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
-数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
-可以创建一个 PositionOptions
类:
-public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
-条件
-选项类要求:
-
-- 必须是包含公共无参数构造函数的非抽象类。
-- 类型的所有公共读写属性都已绑定。
-- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
-由于使用了 Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
-"Position"
进行硬编码。
-
-使用时绑定
-下面的示例代码将:
-
-调用 ConfigurationBinder.Bind
-将类绑定到 Position
部分。
-显示 Position
配置数据。
-
-public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
-IOC 绑定
-var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
-
-可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
-中的代码
-
-使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
-public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
-参考
-
-
]]>
Develop
@@ -28918,6 +28826,98 @@ Core 6.0 添加 JWT 认证和授权
OpenAPI
+
+ .NET Core 中使用配置文件
+ /posts/2023/D4VJ6Q.html
+ ASP.NET Core
+中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:
+
+环境设置文件,appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
。
+设置文件,例如 appsettings.json
+
+
+配置示例
+以 appsettings.json 配置为例,定义如下:
+{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
+加载顺序
+默认的 JsonConfigurationProvider
+会按以下顺序加载配置:
+
+appsettings.json
+appsettings.{Environment}.json
+例如,appsettings.Production.json
和
+appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName
+加载的。 有关详细信息,请参阅在
+ASP.NET Core 中使用多个环境。
+
+后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
+数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
+public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
+通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
+数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
+可以创建一个 PositionOptions
类:
+public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
+条件
+选项类要求:
+
+- 必须是包含公共无参数构造函数的非抽象类。
+- 类型的所有公共读写属性都已绑定。
+- 字段不是绑定的。 在上面的代码中,
Position
未绑定。
+由于使用了 Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串
+"Position"
进行硬编码。
+
+使用时绑定
+下面的示例代码将:
+
+调用 ConfigurationBinder.Bind
+将类绑定到 Position
部分。
+显示 Position
配置数据。
+
+public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
+IOC 绑定
+var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
+
+可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs
+中的代码
+
+使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
+public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
+参考
+
+
+]]>
+
+ Develop
+ DotNET
+ DotNetCore
+
+
+ .NET Core
+
+
.NETCore 批量注册 Service 到 IOC
/posts/2023/23HY8MD.html
@@ -31917,11 +31917,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- C# 读取嵌入的文件
- /posts/2021/2P07T4K.html
- 如何在 C# 中读取嵌入的文件资源?
+ 数组下标无限循环算法
+ /posts/2021/1MAH7MY.html
+ 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
-// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
+// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
]]>
Develop
@@ -31934,11 +31934,11 @@ href="https://www.cnblogs.com/jara/p/7152843.html">C#单元测试:使用Moq框
- 数组下标无限循环算法
- /posts/2021/1MAH7MY.html
- 在进行数组访问时,为了防止数组溢出,可以在在使用中对下标进行处理。处理代码如下:
+ C# 读取嵌入的文件
+ /posts/2021/2P07T4K.html
+ 如何在 C# 中读取嵌入的文件资源?
-// 用于for循环中,最大值溢出时返回到开始
public static int CycleInt(this int index, int count)
{
int indexTemp = index % count;
if (index < 0) return count + indexTemp;
return indexTemp;
}
+// 读取程序中嵌入的文件
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.文件夹名(多层级用.分隔).文件名(带后缀)");
StreamReader sr = new StreamReader(stream, Encoding.UTF8); // 编码格式用utf8,防止中文乱码
var systemShortcutsConfig = sr.ReadToEnd();
sr.Close();
stream.Close();
]]>
Develop
@@ -32110,6 +32110,39 @@ href="https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020">API
C#
+
+ moment 中日期跨年月加减后结果测试
+ /posts/2022/25J6BC2.html
+ 在使用 moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+
+- 2月 28号加一个月是否为 3 月 31 号?
+- 3月 31号减一个月是否为 2 月 28 号?
+
+
+现在直接上代码进行测试:
+const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
+代码实现如下:
+
+]]>
+
+ Develop
+ Javascript
+ Date
+
+
+ Javascript
+ Moment
+ Date
+ galens
+
+
echarts各个配置项概念
/posts/2022/C57H56.html
@@ -32212,39 +32245,6 @@ href="https://echarts.apache.org/handbook/zh/get-started">echarts文档
eggjs
-
- moment 中日期跨年月加减后结果测试
- /posts/2022/25J6BC2.html
- 在使用 moment
-进行日期加减处理时,有些担心其天数会变动,比如:
-
-- 2月 28号加一个月是否为 3 月 31 号?
-- 3月 31号减一个月是否为 2 月 28 号?
-
-
-现在直接上代码进行测试:
-const moment0 = moment('2022-03-31')
console.log('moment0:',moment0.format('YYYY-MM-DD'))
const subMoment = moment0.subtract(1,'month')
console.log('subMoment:',subMoment.format('YYYY-MM-DD'))
const addMoment = moment0.add(1,'month')
console.log('addMoment:',addMoment.format('YYYY-MM-DD'))
const subMoment2 = moment0.subtract(1,'month')
console.log('subMoment2:',subMoment2.format('YYYY-MM-DD'))
// 输出结果
"moment0:" "2022-03-31"
"subMoment:" "2022-02-28"
"addMoment:" "2022-03-28"
"subMoment2:" "2022-02-28"
-代码实现如下:
-
-]]>
-
- Develop
- Javascript
- Date
-
-
- Javascript
- Moment
- Date
- galens
-
-
egg-redis 常用操作
/posts/2022/2JXSX6J.html
@@ -32805,28 +32805,6 @@ href="https://es6.ruanyifeng.com/#docs/promise">ES6入门 之 Promise
promise
-
- 数组中 unshift 与解构赋值一起使用,顺序错误分析
- /posts/2020/1SH18GY.html
- js 数组为空时,使用 unshift
-方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
-
-代码复现:
-const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
-// 结果
空数组 unshift 后的值: [ 1, 2 ]
-我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
-那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>
-
- Develop
- Javascript
- JSLanguage
-
-
- Javascript
-
-
js中对象的创建及理解
/posts/2020/ZWWE36.html
@@ -32914,6 +32892,28 @@ sayName 属性设置成等于全局的 sayName 函数。这样一来,由于 sa
js对象
+
+ 数组中 unshift 与解构赋值一起使用,顺序错误分析
+ /posts/2020/1SH18GY.html
+ js 数组为空时,使用 unshift
+方法,通过解构向数组头部插入数据时,会失效,等同于 push 效果。
+
+代码复现:
+const arr = []
// unshift 2 个值
arr.unshift(...[1,2])
console.log('空数组 unshift 后的值: ',arr);
+// 结果
空数组 unshift 后的值: [ 1, 2 ]
+我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果
空数组 unshift 后的值: [ 2, 1 ]
+那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>
+
+ Develop
+ Javascript
+ JSLanguage
+
+
+ Javascript
+
+
javalscript 中的原型来源和理解
/posts/2021/1RYMZHY.html
@@ -33362,28 +33362,6 @@ JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
lodash
-
- nodejs文件上传下载处理相关的包
- /posts/2021/1TBWW0K.html
-
-文件压缩与解压缩 compressing
-流处理
-pump
-消费流
-stream-wormhole
-
-]]>
-
- Develop
- Javascript
- Nodejs
-
-
- Javascript
- nodejs
- 文件上传下载
-
-
进程守护 pm2 的使用
/posts/2021/31GSH68.html
@@ -33410,6 +33388,28 @@ href="https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/">pm2官方文档
nodejs
+
+ nodejs文件上传下载处理相关的包
+ /posts/2021/1TBWW0K.html
+
+文件压缩与解压缩 compressing
+流处理
+pump
+消费流
+stream-wormhole
+
+]]>
+
+ Develop
+ Javascript
+ Nodejs
+
+
+ Javascript
+ nodejs
+ 文件上传下载
+
+
nodejs 环境安装
/posts/2022/2RW3NJ1.html
@@ -34836,80 +34836,6 @@ href="https://cn.vitejs.dev/config/shared-options.html#resolve-alias">resolve.al
Vite
-
- Windows 中安装 PaddleOCR
- /posts/2022/2775XKA.html
- 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
-PaddleOCR。
-
-Python环境搭建
-安装Anaconda
-
-说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
-
-- Anaconda是1个常用的python包管理程序
-- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
-
-Anaconda下载:
-
-地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
-打开终端并创建conda环境
-
-打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
--> Anaconda Prompt启动控制台
-
-
-创建新的conda环境
-# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
-# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
-
-以上 anaconda 环境和 python 环境安装完毕!
-保持 paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
-安装PaddlePaddle
-
-您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
-安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
-对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
-其中 cp38
中的 38 代表 python 版本号。
-# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
-测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
-]]>
-
- Develop
- Python
- PaddleOCR
-
-
- PaddleOCR
-
-
Python 中函数的参数
/posts/2023/JKVCZP.html
@@ -34987,6 +34913,80 @@ href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888">函数
Python
+
+ Windows 中安装 PaddleOCR
+ /posts/2022/2775XKA.html
+ 本文记录了如何在 Windows 的环境下(Windows Server 2008 R2)安装
+PaddleOCR。
+
+Python环境搭建
+安装Anaconda
+
+说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+
+- Anaconda是1个常用的python包管理程序
+- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。
+
+Anaconda下载:
+
+地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
+打开终端并创建conda环境
+
+打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3
+-> Anaconda Prompt启动控制台
+
+
+创建新的conda环境
+# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
+该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
+# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
+
+以上 anaconda 环境和 python 环境安装完毕!
+保持 paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
+安装PaddlePaddle
+
+您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
+安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
+对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
+其中 cp38
中的 38 代表 python 版本号。
+# 卸载原来的 shapely
pip uninstall shapely
# 复制下载的安装文件到当前目录,执行如下命令
pip install Shapely-1.8.2-cp39-cp39-win_amd64.whl
+测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
+]]>
+
+ Develop
+ Python
+ PaddleOCR
+
+
+ PaddleOCR
+
+
配置Https
/posts/2021/1S7VHNA.html
@@ -35160,6 +35160,65 @@ validation
CurveVector
+
+ .NET 中对所有类添加 IgnoreExtraElements 属性
+ /posts/2022/JME2G9.html
+ 在将 mongodb 中的数据映射到类的时候,当 mongodb
+中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
+BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
+数据库对应的类的定义为:
+[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
+为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
+
+BsonIgnoreExtraElements 位于命名空间
+MongoDB.Bson.Serialization.Attributes 中
+
+这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
+有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
+当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
+// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
+
+ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
+中
+
+
+IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
+Collection
+中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段
+null
,则不存这个字段,简单来说就是省空间,假设一个类中有
+A,B
两个字段,其中 A
+字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
+{A:null, B:'B'}
。
+
+参考
+
+]]>
+
+ Develop
+ Database
+ Mongodb
+ DotNet
+
+
+ .NET
+ MongoDB
+
+
聚合
/posts/2021/MAACZD.html
@@ -35272,65 +35331,6 @@ Aggregation Operations
Aggregation
-
- .NET 中对所有类添加 IgnoreExtraElements 属性
- /posts/2022/JME2G9.html
- 在将 mongodb 中的数据映射到类的时候,当 mongodb
-中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加
-BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]
-数据库对应的类的定义为:
-[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}
-为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
-
-BsonIgnoreExtraElements 位于命名空间
-MongoDB.Bson.Serialization.Attributes 中
-
-这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
-有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
-当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
-// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
-
-ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions
-中
-
-
-IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户
-Collection
-中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段
-null
,则不存这个字段,简单来说就是省空间,假设一个类中有
-A,B
两个字段,其中 A
-字段为空,如果指定该设置,存为 {B:'B'}
,否则,存为
-{A:null, B:'B'}
。
-
-参考
-
-]]>
-
- Develop
- Database
- Mongodb
- DotNet
-
-
- .NET
- MongoDB
-
-
Query 和 Projection 操作符
/posts/2022/TZZNFQ.html
@@ -36483,6 +36483,207 @@ href="https://juejin.cn/post/7158362697803759624">Vue2.7正式发布,终于可
snipets
+
+ vue3 如何在 setup 中调用异步方法
+ /posts/2023/2KBPKH9.html
+
+
+async-await
+
+到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
+
+方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
+<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
+方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
+方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
+参考
+本文参考了以下文章,在此报以诚挚谢意!
+
+]]>
+
+ Develop
+ Javascript
+ Vue
+ Vue3.x
+
+
+ Vue
+ Vue3.x
+ galens
+
+
+
+ vue通信及组件之间传值
+ /posts/2020/2H8Y4ZN.html
+ 常用 vue 通信大概有这几种方式进行:
+
+- 组件间的父子之间的传值
+- 组件间的子父之间的传值
+- 非组件间的组件间的传值(简称:EventBus)
+- sessionStorage 缓存传值
+- 路由带参数跳转进行传值
+- vuex 进行传值
+
+
+组件间的父子之间的传值
+思路:父组件调用子组件 dom
+位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+
+- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
+
+
+
+- 子组件:
+
+
+组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+
+- 子组件:
+
+
+
+- 父组件:
+
+
+非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
+(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
+
+- 组件A:
+
+
+
+- 组件 B:
+
+
+效果展示如下:
+
+
+sessionStorage 缓存
+
+- 组件 A:
+
+
+
+- 组件 B:
+
+
+路由带参数跳转
+
+- 组件 A:有路由默认的页面
+
+
+
+- 组件 B:路由其他页面 children
+
+
+效果如下:
+
+
+vuex
+主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+
+src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
+某文件触发事件
+methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
+展示页面
+<h1>{{this.$store.state.city}}</h1>
+致谢
+本文摘抄至:vue通信及组件之间传值
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue3 语法摘要
/posts/2023/3CG1P9K.html
@@ -37418,48 +37619,26 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
- vue3 如何在 setup 中调用异步方法
- /posts/2023/2KBPKH9.html
-
-
-async-await
-
-到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
-
-方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
-<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #fallback>
Loading...
</template>
</Suspense>
# 若使用 script setup 语法时,可以直接在里面使用 await 等待异步返回
<script setup>
export default {
async setup() {
// 在 `setup` 内部使用 `await` 需要非常小心
// 因为大多数组合式 API 函数只会在
// 第一个 `await` 之前工作
const res = await fetch(...)
const posts = await res.json()
return {
posts
}
}
}
</script>
-方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script>
export default {
setup() {
const users = ref([]);
onBeforeMount(async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/users");
users.value = res.data;
console.log(res);
});
return {
users,
};
},
}
</script>
-方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template>
<div>{{ message }}</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('');
async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.message;
}
fetchData();
return {
message,
};
},
};
</script>
-参考
-本文参考了以下文章,在此报以诚挚谢意!
-
+ LearnVue 介绍
+ /posts/2020/3W94T82.html
+ 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
+入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
+本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>
Develop
Javascript
Vue
- Vue3.x
+ VueBasic
- Vue
- Vue3.x
- galens
+ vue
+ LearnVue
@@ -38540,215 +38719,6 @@ href="https://github.com/vuejs/vue-router-next">vue-router)。
galens
-
- vue通信及组件之间传值
- /posts/2020/2H8Y4ZN.html
- 常用 vue 通信大概有这几种方式进行:
-
-- 组件间的父子之间的传值
-- 组件间的子父之间的传值
-- 非组件间的组件间的传值(简称:EventBus)
-- sessionStorage 缓存传值
-- 路由带参数跳转进行传值
-- vuex 进行传值
-
-
-组件间的父子之间的传值
-思路:父组件调用子组件 dom
-位置声明一个名称,然后在子组件接收这名称,便可直接调用。
-
-- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件):
-
-
-
-- 子组件:
-
-
-组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
-
-- 子组件:
-
-
-
-- 父组件:
-
-
-非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器
-(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue'
let connect = new Vue() // 实例
export default connect
-
-- 组件A:
-
-
-
-- 组件 B:
-
-
-效果展示如下:
-
-
-sessionStorage 缓存
-
-- 组件 A:
-
-
-
-- 组件 B:
-
-
-路由带参数跳转
-
-- 组件 A:有路由默认的页面
-
-
-
-- 组件 B:路由其他页面 children
-
-
-效果如下:
-
-
-vuex
-主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
-
-src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: "上海"
},
actions: {
handleCity(ctx, city) {
// console.log(ctx, city)
ctx.commit("handleCity", city)
}
},
mutations: {
handleCity(state, city) {
state.city = city
}
}
})
-某文件触发事件
-methods: {
handleCityClick(city) {
this.$store.dispatch("handleCity", "北京");
},
-展示页面
-<h1>{{this.$store.state.city}}</h1>
-致谢
-本文摘抄至:vue通信及组件之间传值
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- 在组件内怎么监听 Vuex 中 state 的变化
- /posts/2020/2B9D6M8.html
- 最近在项目中需要使用 Vuex
-来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
-
-有两个办法解决上面的问题:
-
-- 用 computed 属性
-
-本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
-state
-中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
-
-- 用 watch 属性
-
-直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
-表达式,而是要使用完整的方法定义,见下面的代码:
-watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
-
-
-
- LearnVue 介绍
- /posts/2020/3W94T82.html
- 计划系统的对 Vue.js 的源代码进行深入学习。以 learnVue
-入门,因为它当前的 star 数已经破 9k了, 肯定是干货满满的。
-本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>
-
- Develop
- Javascript
- Vue
- VueBasic
-
-
- vue
- LearnVue
-
-
LearnVue 响应式原理
/posts/2020/1P0TW1J.html
@@ -38861,6 +38831,36 @@ href="https://github.com/answershuto/learnVue">LearnVue 。
LearnVue
+
+ 在组件内怎么监听 Vuex 中 state 的变化
+ /posts/2020/2B9D6M8.html
+ 最近在项目中需要使用 Vuex
+来维护一个全局字段,同时在子组件里需要根据该字段的变化向后端请求数据来展示。
+
+有两个办法解决上面的问题:
+
+- 用 computed 属性
+
+本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应
+state
+中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+
+- 用 watch 属性
+
+直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda
+表达式,而是要使用完整的方法定义,见下面的代码:
+watch: {
'$store.getters.loginedProjectGroupId': function(value) {
this.getProjectInfo(value)
}
},
+]]>
+
+ Develop
+ Javascript
+ Vue
+ VueBasic
+
+
+ vue
+
+
Vue 中对跨域的 iframe 进行缓存
/posts/2023/1EARQ0T.html
diff --git "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html" "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
index f5680c4416..2c784ecfcd 100644
--- "a/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
+++ "b/tags/Bentley\344\272\214\346\254\241\345\274\200\345\217\221/page/2/index.html"
@@ -391,8 +391,8 @@ Bentley二次开发
@@ -411,8 +411,8 @@ Bentley二次开发
iEPC数字化全过程工程管理平台(以下简称 iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI @@ -305,16 +303,16 @@
项目创建及任务安排
协同流程
- +详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
diff --git a/search.xml b/search.xml index b5d008ced7..af345c1288 100644 --- a/search.xml +++ b/search.xml @@ -1827,6 +1827,36 @@ https://www.englishclub.com/grammar/verb-tenses.htmthe video form: https://www.youtube.com/watch?v=d0wV9EC3t14
-
+
辅音后的无音要中性化
+what are you
+/ wad ər ju /
+ng 音后如果是元音,ng 发 n 音
+laughing at
+/ lafen ai / at 中的 t 是 stop t
+I wouldn't / ai wuln /
+you said somefunny /ju sei sʌm‘m fʌni: /
+didn't you / dn jə /
+两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
+the guy's a joke machine / dʒou
kməʃn /
+当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
+当只有回答 yes no 时,才用升调
+Someone
who / sʌmwan u /
+can 一般 /kən/
+
-
-
辅音后的无音要中性化
-what are you
-/ wad ər ju /
-ng 音后如果是元音,ng 发 n 音
-laughing at
-/ lafen ai / at 中的 t 是 stop t
-I wouldn't / ai wuln /
-you said somefunny /ju sei sʌm‘m fʌni: /
-didn't you / dn jə /
-两个辅音相连,且不一样时,前一个发音后不要释放,像停止单一样
-the guy's a joke machine / dʒou
kməʃn /
-当两个辅音发音差不多一样时,发重的那个音,省略轻的那个音
-当只有回答 yes no 时,才用升调
-Someone
who / sʌmwan u /
-can 一般 /kən/
-
致谢
解决思路来自优先社区: https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/175980/msce-c-element-bylevel?ReplySortBy=CreatedDate&ReplySortOrder=Ascending
+]]> +本文对常用的 ms 中的线条使用进行总结。
+ +]]>command table 层级问题
+MDL 中的 Command 最多可以定义为 5 层。一个commandnumber +是一个长整型数,如0x01020345。其中的01(十六进制的前面两位) +表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
+如何获得包含某实体的最小的盒子范围
+如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数: +针对元素描述符:mdlElmdscr_computeRange +针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
+一个部件附近元素取得
+问题描述: +首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。 +但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
+目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。 +然后COPY到另一个文件中去。
+ +想问一下经验者,有没有更好的方案。
+解答:
+这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。 +可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
+如何遍历模型包括外部引用在内的所有元素
+MDL 中
+要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
+还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
+想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
+MSElement elem; |
在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int +yourFuncName(void *arg)。下面是FenceDeal的常用写法:
+int FenceDeal (void *arg) |
Add-in
+有一个变通的办法是:
+①放置一个包含所有元素在内的围栅(Fence);
+②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
+当前进度:160页
]]>本文对常用的 ms 中的线条使用进行总结。
-]]> -本文对常用的 ms 中的线条使用进行总结。
- -]]>command table 层级问题
-MDL 中的 Command 最多可以定义为 5 层。一个commandnumber -是一个长整型数,如0x01020345。其中的01(十六进制的前面两位) -表示第一级命令的索引值,02是第二级命令的索引值,03是第三级命令的索引值,4是第四级,5是第五级。它们都是十六进制的,因而可以推断出前三级分别可有最多256个不同的命令键入,后两级最多可有16个不同的命令键入。
-如何获得包含某实体的最小的盒子范围
-如果采用MDL开发方式,帮助文档 MicroStationAPI.chm 里面有两个函数: -针对元素描述符:mdlElmdscr_computeRange -针对元素:mdlElement_extractRange 具体函数说明请看帮助文档
-一个部件附近元素取得
-问题描述: -首先是我选中了一个PIPE或者一系列的PIPE,但是PIPE上面的symbol是单独的CELL,开始选的时候没有选择这些symbol。 -但是我想把我选中的这些PIPE复制到另一个文件和空间WORK的时候,不仅仅复制PIPE,还想复制上面的这些CELL。
-目前想定的方案:拿到选中的PIPE,然后做成一个range,然后进行扫描,去到PIPE附近的这些CELL。 -然后COPY到另一个文件中去。
- -想问一下经验者,有没有更好的方案。
-解答:
-这个方案是可行的。不过需要注意的是,通过Range来扫描不是完全可靠的。想象一条斜线,其Range是包围其两个端点的最小立方盒。按照Range扫描一般来说会多出一些元素而不会漏掉元素。 -可以对扫描得到的元素进行进一步的过滤。对于三维模型来说,就需要用到求两个元素间最小距离的函数mdlKISolid_minimumDistanceBetweenEntities了。
-如何遍历模型包括外部引用在内的所有元素
-MDL 中
-要遍历模型的整个元素,首先想到的是模型元素迭代器。这种遍历方式需要自己获取元素属性,从而屏蔽掉自己不需要处理的元素,所有效率一般。元素迭代器还不能直接访问外部引用元素。
-还有个遍历方法就是scan扫描,scan之前可以定义扫描范围,通过“图层”、"颜色"、“范围”、“线型”等进行过滤。很可惜这种方式虽然效率较高但也不能访问到外部引用元素。
-想得到外部引用里的元素就要用到fence。程序首先自己创建fence,然后得到fence所包含的元素。示例代码如下:
-MSElement elem; |
在FenceDeal回调函数里可以处理包括外部引用在内的所有元素。在V8i中这个FenceDeal回调函数的原型是:int -yourFuncName(void *arg)。下面是FenceDeal的常用写法:
-int FenceDeal (void *arg) |
Add-in
-有一个变通的办法是:
-①放置一个包含所有元素在内的围栅(Fence);
-②用ActiveDesignFile.Fence.GetContents来获得围栅内的元素
-当前进度:160页
]]>Element 克隆
+程序集 | +命名空间 | +
---|---|
Bentley.DgnPlatformNET.dll | +Bentley.DgnPlatformNET | +
//复制元素 |
SolidKernelEntity 克隆
+程序集 | +命名空间 | +
---|---|
Bentley.DgnDisplayNet.dll | +Bentley.DgnPlatformNET | +
// 复制 SolidKernelEntity |
CurveVector 克隆
+调用对象的 Clone()
方法。
Element 克隆
-程序集 | -命名空间 | -
---|---|
Bentley.DgnPlatformNET.dll | -Bentley.DgnPlatformNET | -
//复制元素 |
SolidKernelEntity 克隆
-程序集 | -命名空间 | -
---|---|
Bentley.DgnDisplayNet.dll | -Bentley.DgnPlatformNET | -
// 复制 SolidKernelEntity |
CurveVector 克隆
-调用对象的 Clone()
方法。
Command 配置
+<ItemGroup> |
引用列表
+<Reference Include="Bentley.DgnDisplayNet"> |
Command 配置
-<ItemGroup> |
引用列表
-<Reference Include="Bentley.DgnDisplayNet"> |
CONNECTION Client
,重新打开。可以多试几次
如果 ORD 在安装过程中出现 Failed to copy payload for xxx
+时,可能有几下几个原因:
-
+
由于Connection Client的版本不匹配导致。
+由于.Net Framework 版本不匹配导致的。
+一些国产软件可能会影响安装并导致这个报错。
+可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
+
参考:
+ ]]>VBA rejected the OpenRoads Designer Application Object
-]]> -如果 ORD 在安装过程中出现 Failed to copy payload for xxx
-时,可能有几下几个原因:
-
-
由于Connection Client的版本不匹配导致。
-由于.Net Framework 版本不匹配导致的。
-一些国产软件可能会影响安装并导致这个报错。
-可以在安装时暂时关闭杀毒软件和防火墙,或者重启电脑后再试。
-
参考:
- ]]>-
+
转为 fbx
+导出为 3ds 文件
+ +在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
+
-
-
转为 fbx
-导出为 3ds 文件
- -在 3DMAX 中导出 3DS 格式,然后在 MS 中导入 3DS.
-
今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome +的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
+项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
+安装
+在包管理器中添加 nuget 安装包。
+++Install-Package FontAwesome.Sharp
+
功能
+将 FontAwesome 图标生成图片和 Icon 图标
+Winform 上使用
+-
+
- 在 Winform 上可以使用下列类
+
-
+
- IconButton, +
- IconToolStripButton, +
- IconDropDownButton, +
- IconMenuItem, +
- IconPictureBox 或者 +
- IconSplitButton +
+ - 当然,如果你只想为 icon 生成
+bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
+
var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms |
WPF 上使用
+此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
+致谢
+-
+
- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp +
- 图片来源于网络 +
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
-]]> -今天在 github 上发现了一个可以在 Winform、WPF 中使用 Font Awesome -的项目,本项目不需要自己安装 Font Awesome 字体,用起来很方便。
- -项目地址:https://github.com/awesome-inc/FontAwesome.Sharp
-安装
-在包管理器中添加 nuget 安装包。
---Install-Package FontAwesome.Sharp
-
功能
-将 FontAwesome 图标生成图片和 Icon 图标
-Winform 上使用
--
-
- 在 Winform 上可以使用下列类
-
-
-
- IconButton, -
- IconToolStripButton, -
- IconDropDownButton, -
- IconMenuItem, -
- IconPictureBox 或者 -
- IconSplitButton -
- - 当然,如果你只想为 icon 生成
-bitmap,可以使用
ToBitmap()/ToImageSource
的扩展。如下:
-
var bitmap = IconChar.BatteryEmpty.ToBitmap(16, Color.Black); // Windows Forms |
WPF 上使用
-此处因为不需要,便暂时未做翻译,请直接参考:https://github.com/awesome-inc/FontAwesome.Sharp
-致谢
--
-
- 本文来源于:https://github.com/awesome-inc/FontAwesome.Sharp -
- 图片来源于网络 -
致谢
本文转载于 https://www.bbsmax.com/A/Gkz1ony25R/
+]]> +这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
+ +此处以 StringConverter 为例。
+public class RebarDiameterConverter:StringConverter |
在 GetStandardValues 方法中,会传递下来一个 context, 而 +context.Instance +就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
+]]>PropertyGrid控件就是Visual +Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
+ +普通显示
+在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject +属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
+如果要同时显示多个对象,可以将一个对象数组赋值给 +propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
+更改显示方式
+当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
+特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在 +PropertyGrid 中用到的特性:
+-
+
DescriptionAttribute
+设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
+CategoryAttribute
+设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给 +"杂项" 类别。可以将此特性应用于所有属性。
+BrowsableAttribute
+表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
+ReadOnlyAttribute
+表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有 +get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get +访问器的公共属性也是只读的。
+DefaultValueAttribute
+表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
+DefaultPropertyAttribute
+表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
+
++如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
+
自定义显示
+我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
+//属性表管理类 |
下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
+PropertyManageCls pmc = new PropertyManageCls(); |
显示结果:
+ +实现下拉框
+要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
+//下拉框类型转换器 |
我们实现了下拉框类型转换器,但该如何使用呢?
+-
+
方法一:在属性上方添加标记 +[TypeConverter(typeof(DropDownListConverter))]
+方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
效果图如下:
+ +属性编辑器
+使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
+//文件路径选择 public class PropertyGridFileItem : UITypeEditor |
使用方法:
+-
+
在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem), +typeof(System.Drawing.Design.UITypeEditor))]
+使用代码
+private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
+
效果图如下:
+ +自定义要显示的属性
+PropertyGrid +默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
+-
+
- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为 +[Browsable(false)] +
- 想通过自定义的 Attribute 来控制属性的显示 +
这个时候,我们就需要对显示的属性进行筛选。我们通过实现
+ICustomTypeDescriptor,然后重写方法
+public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+来实现。
实现部分代码如下:
+public class NamedGroup :ICustomTypeDescriptor |
致谢
+[1]. 本文来源:C#自定义PropertyGrid属性
+更多参考资料
+[1]. PropertyGrid控件心得
+[2]. Customized +display of collection data in a PropertyGrid
+[3]. TypeConverter的层次结构
+ + +]]>解决方案
+通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
+解决办法有两种:
+-
+
第一种:在主方法上加上[STAThread]特性标签
+[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
+第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
+Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
+
在代码里面,我的 Main 已经声明了 [STAThread]
+特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
特此记录,以免今后遗忘。
+致谢
+本文摘抄至:妄揽明月
]]>PropertyGrid控件就是Visual -Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。
- -普通显示
-在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject -属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。
-如果要同时显示多个对象,可以将一个对象数组赋值给 -propertyGrid1.SelectedObjects。它会自动计算多个对象的公开属性并显示,当各个对象中属性值相同时,会显示相同的值,如果不同时,则会不显示确定的值。
-更改显示方式
-当只用上面的赋值方式,那么显示出来的数据名称会直接是属性的名称,如果想要进行汉化,需要对每个属性添加相应的特性(Attribute)来进行配置。
-特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了在 -PropertyGrid 中用到的特性:
--
-
DescriptionAttribute
-设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。
-CategoryAttribute
-设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给 -"杂项" 类别。可以将此特性应用于所有属性。
-BrowsableAttribute
-表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。
-ReadOnlyAttribute
-表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有 -get 和 set 访问函数的公共属性在网格中是可以编辑的,如果只有 get -访问器的公共属性也是只读的。
-DefaultValueAttribute
-表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
-DefaultPropertyAttribute
-表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。
-
--如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在要展示的类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了
-
自定义显示
-我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。
-//属性表管理类 |
下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:
-PropertyManageCls pmc = new PropertyManageCls(); |
显示结果:
- -实现下拉框
-要实现下拉框,需要使用类型转换器,继承与TypeConverter或者StringConverter,然后重写方法,代码如下:
-//下拉框类型转换器 |
我们实现了下拉框类型转换器,但该如何使用呢?
--
-
方法一:在属性上方添加标记 -[TypeConverter(typeof(DropDownListConverter))]
-方法二:我们可以在外部定义数组,使用方便,使用方法代码如下:
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
string []s=new string[] { "1", "2", "3", "4" };
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Converter = new DropDownListConverter(s);//Property的Converter属性就可以设置类型转换
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
效果图如下:
- -属性编辑器
-使用属性编辑器实现路径选择,属性编辑器需要继承与UITypeEditor。
-//文件路径选择 public class PropertyGridFileItem : UITypeEditor |
使用方法:
--
-
在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem), -typeof(System.Drawing.Design.UITypeEditor))]
-使用代码
-private void Form_load(object sender, EventArgs e)
{
PropertyManageCls pmc = new PropertyManageCls();
Property pp = new Property(txtname.Text,txtvalue.Text, false, true);
pp.Category = "基本信息";
pp.DisplayName = "我的ID";
pp.Editor= new PropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
pmc.Add(pp);
propertyGrid1.SelectObject = pmc;
}
-
效果图如下:
- -自定义要显示的属性
-PropertyGrid -默认显示所有的公开属性,包括父类的公开属性。在使用的过程中,我们可能会有如下需求:
--
-
- 只想显示子类的某些属性,而父类因为某些原因不能将它的属性标记为 -[Browsable(false)] -
- 想通过自定义的 Attribute 来控制属性的显示 -
这个时候,我们就需要对显示的属性进行筛选。我们通过实现
-ICustomTypeDescriptor,然后重写方法
-public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
-来实现。
实现部分代码如下:
-public class NamedGroup :ICustomTypeDescriptor |
致谢
-[1]. 本文来源:C#自定义PropertyGrid属性
-更多参考资料
-[1]. PropertyGrid控件心得
-[2]. Customized -display of collection data in a PropertyGrid
-[3]. TypeConverter的层次结构
- - -]]>这个时候,我们可能会有这样的要求,一个属性的改变会导致另一个属性的候选项发生改变,也就是说,我们需要为特定属性设置动态的下拉选项。
- -此处以 StringConverter 为例。
-public class RebarDiameterConverter:StringConverter |
在 GetStandardValues 方法中,会传递下来一个 context, 而 -context.Instance -就是调用该转换器的实例,所以,将它转换成相应的对象,然后利用对象里面的值来动态生成下拉选项。
-]]>解决方案
-通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。
-解决办法有两种:
--
-
第一种:在主方法上加上[STAThread]特性标签
-[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogInForm());
}
-第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)
-Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();
-
在代码里面,我的 Main 已经声明了 [STAThread]
-特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。
特此记录,以免今后遗忘。
-致谢
-本文摘抄至:妄揽明月
-]]>Excel
+ +参考:
+ +]]>Excel
- -参考:
- -]]>摘抄至:
+http://www.ruanyifeng.com/blog/2014/05/restful_api.html
+]]>504HTTP
摘抄至:
-http://www.ruanyifeng.com/blog/2014/05/restful_api.html
-]]>本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30 +分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
+ +到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
+约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
+但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
+后记:
+这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
+同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
+]]>事情就这样过去了,老卓后来的几天工作虽照常,但谁都看得出来是有心事。最后他鼓起勇气拿着自己从老家带来特产趁着下班时间敲开了小甘的房门:“这不是答应了过年来给你一份新年礼物吗?你瞧,我拿来了,那天的事情你知道我嘴笨......”
还没等老卓说完,小甘哭笑不得,“老卓,你并没有做错什么,错的是我咧!”
原来那天老卓说出口的话并没有让小甘生气,而是震惊了许久。面对着眼前的老卓,小甘继续补充到:“做人做事要有原则、有底线,施工安全更是如此,任何时候都不能动摇,感谢你通过这样的一句话教会我了这个道理,这个新年礼物来的比什么都要珍贵哩!”
-]]> -本周轮到我值夜班,今天早早的就起来了,也没有了平时的睡意。我记得睁开眼大约是8:30 -分左右,懒了一会儿床,起来就9点了。本想着做一篇西安的攻略,可是想想,好像时间还蛮多,应该出去走走。在益阳的半年里,很多地方都已经去了,漫无目的在网上浏览者,在地图上惊鸿一瞥,发现沅江是个好地方。洗漱完,想做个攻略再走,但是担心时间不够,所以直接拎着包和相机就出门了。
- -到达车站之前,我都不知道车票是多少,后来一买票才知道,只需要10块。心里还是蛮高兴,走对了,应该不远,一天来来回回够了。
-约3刻钟的样子,就到了沅江。初识的沅江给人印象并不是很好,车站很破,楼房全部散布着暮年的气息,慵懒的在街边立着。沅江的交通我最是不喜欢,公交不会报站,特别是在网上查不到公交的信息,对于我一个陌生人来讲,这是比较麻烦的事。
-但沅江有她自己的魅力。每一块土地拥抱着湖泊,每一个湖泊躺在一块土地上。多水的沅江,尽是柔柔的美。这儿的人过得很惬意,面里总是带着欢快,在他们的身上看不到生活的压力,舒缓的节奏,那么自然。
-后记:
-这篇游记并未完成,但是却反应了才毕业不久的自己不甘工地的平淡生活,从时间缝里去拥抱世界的精神,这也为后来的辞职作下了铺垫。
-同时,这种精神,都值得现在的自己学习:心有抱负,积极阳光。
]]>梦到这儿就结束了,醒来之后,一切历历在目,无比清晰,翻了下手机相册,略有失望。
我在思考,旅行,究竟是为了什么,答案应该是去一个美好的地方,放松自己的心灵,这个梦,让思想进行了一次旅行。
身在闹市,不为车马喧,我们自己的世界,应由自己来丰富。
+]]> +我想,大概是我们走得太快,时间也跟不上了。
+ +走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
+从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
+不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
+庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
+听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
+天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
+ ]]>我想,大概是我们走得太快,时间也跟不上了。
+走得太快,便错过了路上的风景。昨天出门没有看天气预报,便没有带伞,出了门,回家的时候,天突然下起了淅淅沥沥的小雨,淋着雨,一路跑了回来,换了身衣服,略有后悔,要是早一点回来,就不会淋湿了。今天回想起来,昨日的自己却是错了一场浪漫的雨。
-从前的自己,很喜欢下雨。让雨落在头发上,打在湿了的衣服上,脚踩在路边的小水洼里,然后溅起一滩泥水,随性而为的放松,让人痴迷。现在因为匆匆的自己,下了雨,却没了感受的心,遗憾的错了雨的一厢情愿。
-不知道这是不是很多人的感觉,当阳光透过窗子,照在你的桌子上,你用笔尖在阳光下写着承载着自己思想的文字,这一刻,世界是那么安静,一刻好似永恒。而现在,因为匆匆,已经有很长一段时间没有见过黄昏了。家里的玻璃,成了冰冷的窗户,窗帘,埋葬了如诗的生活。
-庆幸自己偶然慢了下来,可以让思想驰骋去更广阔的世界。
-听着舒缓的音乐,闭着眼睛,细细品味着每个音符的跳动,一切的烦恼和压力,随之消散,此时的声音,便是最好的天籁。走得慢了,也就走进心里去了。这让我想起了一个朋友曾经讲过的一句话,“真不敢相信自己是在西安旅游,感觉就是在家旁边逛了一个古镇”。是的,走心的生活,一行一亍,都是美好,空间里没了时间。
-天快黑了,夜晚开始慢慢苏醒,天上稀稀落落的星慢慢探出头来,他们来到地球,是走得快还是慢呢?
- +去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
+和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
+有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
+我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
+夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
+大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
+已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
+等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>工作中的人,有的可爱,有的又是可恨,有的紧着小家,但却失了大家。工作环境的复杂,不是外部,而是人心。老张是施工队的负责人,在他的眼中,大多数时候只有利益。在需要别人的时候,卑躬屈膝,当找他帮忙时,便笑里藏刀,表面答应得好好的,可是转身就抛之脑后。这是最为可恶的行径了,忍不住让人感叹。老张时常在嗟叹,生活之不易,可是却忘了,大家的生活都是不易的,他只顾着自己了,从没想过,在人生的路上,相互扶持,是他的无奈呢,还是他本无心。
他,耐不了人与人之间的这些不真诚,便悄悄地决定走了,每天做着浪费生命的毫无意义的人际交往,这本也不是他期待的生活。其他人都说,搞工程四海为家,而他却觉得那个只是宿舍。换了新工作,他看到了希望,同时又出现了新的绝望。现在住的地方不叫宿舍了,但也不叫家,对于他来说那只是落脚点。他时常一个人发着呆,不胜感慨,诺大的城市,容得下他的,只有几个平米。没有经历过,便都是向往,以前的他,只知隔行如隔山,可是却不懂得,每座山中都有虎。生活的无奈,已经不是无病呻吟的句子,而是赤裸裸的现实。他也不知剩下的光阴是或喜,只是一步一步,走下去。
3 来世 若是有来世,他希望,一切都好。
-]]> -去年夏末的时候,我和他相识。他初给我的印象是很阳光,脸上的轮廓略显刚毅,戴着一副黑框眼镜,又显得很斯文。他说话时带着一点甘肃的口音,总是把”yun”读作“yong”,当时听到这个口音的时候,很是亲切,大约是大学有一个好友,也是甘肃的缘故吧。
-和他第一次见面是在施工现场的办公室,我不认识他,他也不认识我,虽然见了面,好像也没打招呼。就这样呆了一两个月,慢慢地变得熟悉,熟悉彼此的性格,熟悉彼此的价值观,熟悉对方有没有女朋友,然后就成为了好朋友。
-有句话说得很对,只有当失去了,你才会懂得珍惜。我离开之后,才发现那段青葱的岁月,如此值得怀念。自换了工作已有两月余,面对新环境,我战战兢兢的生活和工作着,一个人,一座城,默默地打拼。每天拼命的学习,认识了另外的人,做另外的事,一切,都很累。静下来的时候,总会很想念以前的日子。
-我和他的床是对着的,中间隔了一张桌子,是少强留下的,后来又有一张,好像是李伟的。我俩把它们拼在了一起,我在上面放了个简易书架,还养了一盆“小家碧玉”。有时候我会给它拍拍照,他会浇浇水,虽然是我买的,好像更是他的宝贝。
-夏天的时候,外面很热,他去买水的时候,总会捎上我的一份,有时候桌上的纸巾用完了,他会多拿出一卷,一卷放在他那儿,一卷放在我这边。上次出去把妹,他还和我商量着暗号,要是钱不够了,打个电话给他,他立马给我想办法,在电话里就问,拆迁怎么样了,拆了一栋就是一千,两栋就是两千,免得被姑娘听见自己借钱,很窘迫,我笑他,我这是举朋友之力追妹子啊。我知道,要是我真这样给他打电话,他肯定会马上帮我解决的。我们的交情不需要在意金钱,只是彼此肝胆相照。
-大学就很喜欢吃鱼,有一次,拽着他去了工艺美大旁边吃了那儿的纸包鱼,很鲜嫩,这是第一次吃纸包鱼,后来在其他地方也吃过,可是没那味道,好像从那时候起,他也迷上吃鱼了。有一天,咱俩就约着,把益阳的鱼尝个遍。为了吃一次鱼,我俩先是转了一趟公交,然后打了快半个小时的车,才到城院的小吃街那边,鱼店很多,觅着一家烤鱼店就窜进去了,那儿的鱼也很好吃。
-已经离开益阳有一段时间了,有一天晚上,微信振动,是他发来的消息,有一个定位,然后来了句想你了。初听这话,以为他是开玩笑的,居然写得那么肉麻,然后点开定位,突然发现,那是我们第一次吃鱼的位置,他在那边喝酒,应该是喝了有几分了,此时,虽然和他隔了一个省的距离,但仍能感受到那如浓酒般的思愁。我也非常怀念彼此共同度过的岁月,真挚而又轻松,快乐而又写意。人生又哪能轻易找到几个这样的知心朋友呢?
-等他来到我的地方,等我去到他的城市,等和他在远方遇见,不醉不归。
]]>七月过成了安生,安生活成了七月。
+恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
+安生给七月打电话。
+“七月,工作怎么样?”
+“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
+“工资怎么样?”
+“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高 +“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
+七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
+安生活成了七月想的那样。
+七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
+七月在挣脱。
+]]>七月过成了安生,安生活成了七月。
-恰好,我也有两个朋友,一个叫七月,另一个是安生,他俩是基友。七月成绩一直优秀,初中出去上通宵,第二天考试拿了年级第一,高中走路都在看小说,成绩也还不错,大学成绩差点保研,在所有人眼中他会很有出息;安生浪荡,也很贪玩儿,初中留了级,高中辍学出去潇洒,大学挂科,他有自己的想法,没毕业,自己赚钱买了一辆车。
-安生给七月打电话。
-“七月,工作怎么样?”
-“工作很累,没有休息的时间,感觉整天都在工作,不是我想要的生活。”
-“工资怎么样?”
-“不怎么样,有点低……”七月心里其实还有一点自豪,因为他的很多朋友工资没他高 -“确实有点低啊。我在学校旁边和人开了一个点,每天能赚个2000左右吧。”
-七月第一年工作回去和安生见了一面,是安生开车来接的他,安生的车技很好,放的歌不像七月听的那样安静,很激昂。安生很忙,他们吃了一碗面就分开了,安生给七月带去了震撼,七月也想要一辆车,想要安生的潇洒生活。
-安生活成了七月想的那样。
-七月想去环游世界,想有一辆车,一幢房子,想给父母好的生活......
-七月在挣脱。
-]]>合照
-一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了 -“天似穹庐,笼盖四野” -的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
-写大家释放激情
-写大家放松与交流
-本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
-]]>新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
-我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
-我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
-以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
-曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
-然而,随着新冠的出现,连续几年的抗疫,再加 2022 -年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
-真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
-]]>合照
+一进入木兰草原,一股厚重的苍茫感就迎面扑来,它挟着初冬的一丝凛冽,将春夏的苍翠,华作漫天枯黄。走在小道上,呼吸着微风中淡淡的青草味,看着远山上朦朦胧胧的牛马食草,感受着四周无边无际的草原,木兰草原在这一刻,仿佛有了生命,一下子将我们拉进了 +“天似穹庐,笼盖四野” +的壮阔草原里,置身此情此景,我们不禁惊叹住了,这正是我们想象中的草原的样子:“天苍苍,野茫茫,风吹草低见牛羊”
+写大家释放激情
+写大家放松与交流
+本次活动,似湖面上溅起的一缕涟漪,荡漾起了大家内心深处的激情澎湃;又如冬日里绽放的暖阳,治愈了每个人精神上的紧绷与疲惫;也像大地上溪流汇成的江河,消融了彼此间的陌生,增进了彼此的感情,在未来,我们将携手同行,扬帆大海。
+]]>新冠疫情终于渐渐淡化,笼罩在心头的无尽的阴霾也慢慢散去,这个周末,春光正好,于是和老婆小孩一起,到东湖赏梅散心。
+我们是开车去的,快到东湖入口时,便已经堵着走不动了,我便留意起从旁边经过的行人,他们之中有的是情侣,有的是一家人,有的是大学生,三五成群,或是步行,或是骑着自行车,有说有笑,朝着东湖前行。
+我面无表情地坐在车里,感受着他们的喜悦,脑海深处仿佛有一股躁动正在挣脱束缚,想要喷涌而出。我循着这似曾相识的场景渐渐回忆,霎那间,仿佛大江决堤,山崩地裂,那股躁动终于奔腾而出,熟悉的感觉重回身体,我心中突然明悟了:曾经的自己也和他们一样,生命在热烈地绽放,曾几何时,我却丢掉了它们。
+以前,自己也和他们一样,喜欢用脚丈量大地,喜欢微风轻拂面颊,喜欢享受旅途风景,喜欢用真诚去体悟生命。
+曾经的自己,可以一念起,横空数千公里,南下丽江赏秋雪;可以心意动,恕爬十几小时,登顶峨嵋观云海;可以兴致至,跨越千万山水,西行茶卡照天镜。
+然而,随着新冠的出现,连续几年的抗疫,再加 2022 +年底防疫的彻底放开,全家感染,自己渐渐疲于奔命,迷失在了忙忙碌碌地的生活里,虽然每天依然吃饭喝水、上班下班、买菜做饭,但总感觉少了些什么。直到今天,我突然明悟过来,是少了一缕光,一缕绽放生命的光。
+真是浮沉喧嚣不惊觉,一朝醒来入凡心,好在重拾初心志犹在,上揽苍穹下关月。
+]]>设计基准期计算
+ +++超越概率 = 1 - p
+
建筑结构分项系数
+系数 | +说明 | +作用效应对承载能力不利时 | +作用效应对承载能力有利时 | +
---|---|---|---|
\(\gamma_G\) | +永久作用 | +1.3 | +<=1.0 | +
\(\gamma_P\) | +预应力作用 | +1.3 | +<=1.0 | +
\(\gamma_Q\) | +可变作用 | +1.5 | +0
+特别注意,有利时,可变荷载的分项系数为 0 |
+
基本组合计算
+如果组合中,有两个及以上的可变荷载,需要 +取最大的两个分别作为主导荷载 +进行计算。其计算公式如下:
+ +当有 2 个及以上可变荷载时,快速计算公式如下:
+ +标准组合计算
+如果组合中,有两个及以上的可变荷载,需要 +取最大的两个分别作为主导荷载 +进行计算。其计算公式如下:
+ +当有 2 个及以上可变荷载时,快速计算公式如下:
+ +求内力的极值
+最大值
+如果题目让求内力(弯矩、轴力)的最大值,则应:
+-
+
- 同时组合所有可能参与的活载 +
- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值 +
最小值
+如果题目中让求内力的最小值时,则应:
+-
+
- 组合时,尽可能少地考虑活载的组合 +
其它经验
+在审题时,要注意给定的一些条件。比如提到钢结构
和
+检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
+还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
+]]>设计基准期计算
- ---超越概率 = 1 - p
-
建筑结构分项系数
-系数 | -说明 | -作用效应对承载能力不利时 | -作用效应对承载能力有利时 | -
---|---|---|---|
\(\gamma_G\) | -永久作用 | -1.3 | -<=1.0 | -
\(\gamma_P\) | -预应力作用 | -1.3 | -<=1.0 | -
\(\gamma_Q\) | -可变作用 | -1.5 | -0
-特别注意,有利时,可变荷载的分项系数为 0 |
-
基本组合计算
-如果组合中,有两个及以上的可变荷载,需要 -取最大的两个分别作为主导荷载 -进行计算。其计算公式如下:
- -当有 2 个及以上可变荷载时,快速计算公式如下:
- -标准组合计算
-如果组合中,有两个及以上的可变荷载,需要 -取最大的两个分别作为主导荷载 -进行计算。其计算公式如下:
- -当有 2 个及以上可变荷载时,快速计算公式如下:
- -求内力的极值
-最大值
-如果题目让求内力(弯矩、轴力)的最大值,则应:
--
-
- 同时组合所有可能参与的活载 -
- 对一些较大的活载,分别设为 \(S_{Q1}\) 来计算,然后取最大值 -
最小值
-如果题目中让求内力的最小值时,则应:
--
-
- 组合时,尽可能少地考虑活载的组合 -
其它经验
-在审题时,要注意给定的一些条件。比如提到钢结构
和
-检修材料
,就要知道据《钢规》3.3.4 条规定,要进行折减。
要注意一些陷阱,有些时候给的多余参数是没用的。比如当只有一个活荷载时,给你组合系数,计算时,就不需要乘以组合系数。
-还要熟知一些简单结构的内力计算公式。比如简支梁在均布荷载下,跨中最大弯矩计算公式。
-]]>Office Tool Plus 基于 Office -部署工具 和 OSPP -制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载 -Office,当然,你也可以使用 Office Tool Plus -内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
--- -系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或 -macOS)。
-
若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
-软件下载
-打开下载界面: 下载 | Office Tool -Plus 官方网站 (landian.vip)
-按图中所示选择版本进行下载。
- -Office 安装
-下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
-打开安装界面
-
-
选择【部署】
-选择安装 office 版本
- --
建议选择带有年份的升级版本,比如 Office 2021 -企业长期版本,下方将以该版本为例进行安装
-
-选择要安装的产品
-
-添加语言
-
-开始部署
-单击【开始部署】进行下载和安装
-
Office 激活
-当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
-可按下图的步骤进行安装:
- -安装详细步骤如下:
--
-
展开许可证管理
-安装许可证
-选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
-
-设置 KMS 激活服务器
-可以在 https://www.kms.pub/rank.html 处查询 KMS -服务器,推荐使用检测成功次数较多的服务器,比如:
-win.kms.pub
将激活服务器网址输入到 KMS -主机名称框中,然后单击【设置主机(S)】
-单击【激(A)】进行激活
-出现如下提示则代表激活成功:
-
-
参考
- -]]>Office Tool Plus 基于 Office +部署工具 和 OSPP +制作,可以很方便的部署 Office,其内置迅雷引擎可帮助您更快地下载 +Office,当然,你也可以使用 Office Tool Plus +内置的各种小工具或者功能快捷、方便地激活和管理 Office 哦!
+++ +系统要求:Windows 10 或更高版本,不支持其他操作系统(例如 Linux 或 +macOS)。
+
若是 win10 以下的系统,推荐使用手动激活的方式:Windows/Office一键激活
+软件下载
+打开下载界面: 下载 | Office Tool +Plus 官方网站 (landian.vip)
+按图中所示选择版本进行下载。
+ +Office 安装
+下载完成后,将压缩包解压,然后单击 Office Tool Plus.exe
+打开安装界面
-
+
选择【部署】
+选择安装 office 版本
+ ++
建议选择带有年份的升级版本,比如 Office 2021 +企业长期版本,下方将以该版本为例进行安装
+
+选择要安装的产品
+
+添加语言
+
+开始部署
+单击【开始部署】进行下载和安装
+
Office 激活
+当提示安装完成后,单击左侧菜单【激活】跳转到激活页面。
+可按下图的步骤进行安装:
+ +安装详细步骤如下:
+-
+
展开许可证管理
+安装许可证
+选择在部署步骤中安装的 Office 版本,然后单击【确定(O)】安装许可证
+
+设置 KMS 激活服务器
+可以在 https://www.kms.pub/rank.html 处查询 KMS +服务器,推荐使用检测成功次数较多的服务器,比如:
+win.kms.pub
将激活服务器网址输入到 KMS +主机名称框中,然后单击【设置主机(S)】
+单击【激(A)】进行激活
+出现如下提示则代表激活成功:
+
+
参考
+ +]]>iEPC数字化全过程工程管理平台(以下简称
iEPC)是一个集项目管理、OA办公、BIM生命周期应用、工程AI
@@ -22190,16 +22190,16 @@ alt="image-20230809130745354" />
协同流程
- +详细使用文档
在日常的使用中,可以按下列的流程,一步一步来操作。
iEPC 登陆
单击打开 iEPC 桌面端安装包中的
iEPCDesktop.exe
,输入账号密码登陆。
新建本地工作目录
什么是本地工作目录?
@@ -24067,66 +24067,6 @@ alt="image-20220522105109562" />在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
-方法,并在此处监听 OnSelectionChanged
-事件,从事件参数中可以获取 Action
,当 Action
-为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
-时,就代表双击的元素。具体代码如下:
// 该类继承 Bentley.MstnPlatformNET.AddIn |
--]]>程序使用了 COM 接口,所以需要的引入 -Bentley.MicroStation.dll,COM接口位于 -Bentley.MstnPlatformNET.InteropServices 命名空间中。
-
ElementChangedEventHander
事件。
-
-事件有一个
-ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
获取操作
-获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
-来获取,它的值如下:
public enum ChangeTrackKind |
获取新元素
-属性 NewElement
代表新元素。
获取旧元素
-参考
- -]]>在理解 MS 中各个对象返回的 DTransform +含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
+ +DPlane3d
+public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld +的逆。
+DTransform3d
+通过 DTransform3d 生成的矩阵在变换时,直接使用。
+比如下面这个方法:
+// origin 代表的是平移值 |
上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
+]]>在理解 MS 中各个对象返回的 DTransform -含义时,先弄明白谁是度量矩阵,另一个是它的逆,就很好理解了。
- -DPlane3d
-public bool GetTransforms(out DTransform3d planeToWorld, out DTransform3d worldToPlane)
planeToWorld 是 Plane 坐标系的度量矩阵,worldToPlane 是 planeToWorld -的逆。
-DTransform3d
-通过 DTransform3d 生成的矩阵在变换时,直接使用。
-比如下面这个方法:
-// origin 代表的是平移值 |
上述静态通过局部坐标系(原点和三个方向)来生成一个矩阵,这个矩阵其实是该坐标系度量矩阵的逆,所以如果想要将模型变换到该坐标系下,直接左乘该矩阵即可。
-]]>序
+对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初 +Bentley 采用 XAttribute 的方式在 dgn +文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley +经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework +(Engineering Content Framework ),通过这套方案 +Bentley真正实现各个专业软件之间数据的无损流动和互动。
+对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
+-
+
- EC +
- ItemType +
- XAttribute +
EC
+查询所有 ECInstance
+查询特定 ECInstance
+ItemType
+XAttribute
+参考
+ + + +]]>在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run
+方法,并在此处监听 OnSelectionChanged
+事件,从事件参数中可以获取 Action
,当 Action
+为 SelectionChangedEventArgs.ActionKind.DoubleClickElement
+时,就代表双击的元素。具体代码如下:
// 该类继承 Bentley.MstnPlatformNET.AddIn |
++]]>程序使用了 COM 接口,所以需要的引入 +Bentley.MicroStation.dll,COM接口位于 +Bentley.MstnPlatformNET.InteropServices 命名空间中。
+
ElementChangedEventHander
事件。
+
+事件有一个
+ElementChangedEventArgs
,从这个参数中可以获取需要的信息。
获取操作
+获取是什么操作导致元素被修改,可以通过 ChangeTrackKind
+来获取,它的值如下:
public enum ChangeTrackKind |
获取新元素
+属性 NewElement
代表新元素。
获取旧元素
+参考
+ +]]>序
-对于工程信息,主要分为几何数据与工程数据两个部分,对于几何数据,Bentley采用模型来表达。而工程数据,起初 -Bentley 采用 XAttribute 的方式在 dgn -文件中开辟一个特定空间存储非几何数据,但是在由于没有统一数据存储的方式和格式,导致不同专业软件之间的信息无法交流。最后,Bentley -经过大量的摸索和借鉴形成了一套系统的数据解决方案系统 ECFramework -(Engineering Content Framework ),通过这套方案 -Bentley真正实现各个专业软件之间数据的无损流动和互动。
-对于仅需要向 dgn 保存自己工具所产生的数据,可以有如下三种方式:
--
-
- EC -
- ItemType -
- XAttribute -
EC
-查询所有 ECInstance
-查询特定 ECInstance
-ItemType
-XAttribute
-参考
- - - -]]>ASP.NET Core Web API 中控制器操作的返回类型
-]]> --
-
环境设置文件,
-appsettings.{Environment}.json
例如,
appsettings.Production.json
和 -appsettings.Development.json
。
-设置文件,例如
appsettings.json
-
配置示例
-以 appsettings.json 配置为例,定义如下:
-{ |
加载顺序
-默认的 JsonConfigurationProvider -会按以下顺序加载配置:
--
-
appsettings.json
-
-appsettings.{Environment}.json
例如,
appsettings.Production.json
和 -appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName -加载的。 有关详细信息,请参阅在 -ASP.NET Core 中使用多个环境。
-
后加载的 appsettings.{Environment}.json
的值会覆盖掉
-appsettings.json
中相同的键。
数据访问
-要访问配置,使用 IConfiguration
-的接口获取数据,Configuration 在 IOC
-容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
public class TestModel : PageModel |
通过路径获取数据
-想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
-进行分隔,例如:Position:Name
。
数据绑定
-定义
-可以定义类来将 json 配置映射成强类型,这样方便使用。
-例如有如下配置:
-"Position": { |
可以创建一个 PositionOptions
类:
public class PositionOptions |
条件
-选项类要求:
--
-
- 必须是包含公共无参数构造函数的非抽象类。 -
- 类型的所有公共读写属性都已绑定。 -
- 字段不是绑定的。 在上面的代码中,
Position
未绑定。 -由于使用了Position
-字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串 -"Position"
进行硬编码。
-
使用时绑定
-下面的示例代码将:
--
-
调用 ConfigurationBinder.Bind -将类绑定到
Position
部分。
-显示
Position
配置数据。
-
public class Test22Model : PageModel |
IOC 绑定
-var builder = WebApplication.CreateBuilder(args); |
--可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs -中的代码
-
使用
-通过 IOptions<T>
来通过 IOC
-自动获取注册的实例。
public class Test2Model : PageModel |
参考
- - ]]>-
+
环境设置文件,
+appsettings.{Environment}.json
例如,
appsettings.Production.json
和 +appsettings.Development.json
。
+设置文件,例如
appsettings.json
+
配置示例
+以 appsettings.json 配置为例,定义如下:
+{ |
加载顺序
+默认的 JsonConfigurationProvider +会按以下顺序加载配置:
+-
+
appsettings.json
+
+appsettings.{Environment}.json
例如,
appsettings.Production.json
和 +appsettings.Development.json
文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName +加载的。 有关详细信息,请参阅在 +ASP.NET Core 中使用多个环境。
+
后加载的 appsettings.{Environment}.json
的值会覆盖掉
+appsettings.json
中相同的键。
数据访问
+要访问配置,使用 IConfiguration
+的接口获取数据,Configuration 在 IOC
+容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:
public class TestModel : PageModel |
通过路径获取数据
+想发通过路径的方式来获取数据,不同层级的路径名之间使用 :
+进行分隔,例如:Position:Name
。
数据绑定
+定义
+可以定义类来将 json 配置映射成强类型,这样方便使用。
+例如有如下配置:
+"Position": { |
可以创建一个 PositionOptions
类:
public class PositionOptions |
条件
+选项类要求:
+-
+
- 必须是包含公共无参数构造函数的非抽象类。 +
- 类型的所有公共读写属性都已绑定。 +
- 字段不是绑定的。 在上面的代码中,
Position
未绑定。 +由于使用了Position
+字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串 +"Position"
进行硬编码。
+
使用时绑定
+下面的示例代码将:
+-
+
调用 ConfigurationBinder.Bind +将类绑定到
Position
部分。
+显示
Position
配置数据。
+
public class Test22Model : PageModel |
IOC 绑定
+var builder = WebApplication.CreateBuilder(args); |
++可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs +中的代码
+
使用
+通过 IOptions<T>
来通过 IOC
+自动获取注册的实例。
public class Test2Model : PageModel |
参考
+ + +]]>// 读取程序中嵌入的文件 |
// 用于for循环中,最大值溢出时返回到开始 |
// 用于for循环中,最大值溢出时返回到开始 |
// 读取程序中嵌入的文件 |
moment
+进行日期加减处理时,有些担心其天数会变动,比如:
+-
+
- 2月 28号加一个月是否为 3 月 31 号? +
- 3月 31号减一个月是否为 2 月 28 号? +
现在直接上代码进行测试:
+const moment0 = moment('2022-03-31') |
代码实现如下:
+ +]]>moment
-进行日期加减处理时,有些担心其天数会变动,比如:
--
-
- 2月 28号加一个月是否为 3 月 31 号? -
- 3月 31号减一个月是否为 2 月 28 号? -
现在直接上代码进行测试:
-const moment0 = moment('2022-03-31') |
代码实现如下:
- -]]>代码复现:
-const arr = [] |
// 结果 |
我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
-// 期望结果 |
那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
-]]>代码复现:
+const arr = [] |
// 结果 |
我们发现,上面的结果并不是我们想要的,我们所期望的结果应该是:
+// 期望结果 |
那么,为什么出现上面意外的结果,原因就是因为 arr 初始值为空。
+]]>文件压缩与解压缩 compressing
流处理
-pump
消费流
-stream-wormhole
文件压缩与解压缩 compressing
流处理
+pump
消费流
+stream-wormhole
Python环境搭建
-安装Anaconda
--
-
说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
--
-
- Anaconda是1个常用的python包管理程序 -
- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。 -
-Anaconda下载:
--
-
地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
-大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
-
-下载完成后,双击安装程序进入图形界面
-默认安装位置为C盘,建议将安装位置更改到D盘:
-
-勾选conda加入环境变量,忽略警告:
-
-
-
打开终端并创建conda环境
--
-
打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3 --> Anaconda Prompt启动控制台
- --
-
创建新的conda环境
--# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-之后命令行中会输出提示信息,输入y并回车继续安装
-
-激活刚创建的conda环境,在命令行中输入以下命令:
--# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
-
以上 anaconda 环境和 python 环境安装完毕!
-保持
paddle_env
-处于激活状态,下面两步都需要在这个环境中进行安装。
-
安装PaddlePaddle
--
-
您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
-python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-您的机器是CPU,请运行以下命令安装
-python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-
安装PaddleOCR whl包
-pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本 |
对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
其中 cp38
中的 38 代表 python 版本号。
# 卸载原来的 shapely |
测试
-paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false |
Python环境搭建
+安装Anaconda
+-
+
说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包
+-
+
- Anaconda是1个常用的python包管理程序 +
- 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。 +
+Anaconda下载:
+-
+
地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
+大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe
+
+下载完成后,双击安装程序进入图形界面
+默认安装位置为C盘,建议将安装位置更改到D盘:
+
+勾选conda加入环境变量,忽略警告:
+
+
+
打开终端并创建conda环境
+-
+
打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3 +-> Anaconda Prompt启动控制台
+ +-
+
创建新的conda环境
++# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
+之后命令行中会输出提示信息,输入y并回车继续安装
+
+激活刚创建的conda环境,在命令行中输入以下命令:
++# 激活 paddle_env 环境
conda activate paddle_env
# 查看当前python的位置
where python
+
以上 anaconda 环境和 python 环境安装完毕!
+保持
paddle_env
+处于激活状态,下面两步都需要在这个环境中进行安装。
+
安装PaddlePaddle
+-
+
您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
+python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
+您的机器是CPU,请运行以下命令安装
+python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
+
安装PaddleOCR whl包
+pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本 |
对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题
。建议从这里下载shapely安装包完成安装。
其中 cp38
中的 38 代表 python 版本号。
# 卸载原来的 shapely |
测试
+paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false |
BsonIgnoreExtraElements
特性,即可解决。
+
+正文
+假设有如下 mongodb 数据:
+[ |
数据库对应的类的定义为:
+[BsonIgnoreExtraElements] |
为了使 mongodb 在映射到 Person
时不报错,要在
+Person
上添加 [BsonIgnoreExtraElements]
+特性。
++BsonIgnoreExtraElements 位于命名空间 +MongoDB.Bson.Serialization.Attributes 中
+
这种方式有个弊端,如果要在每一个类上添加
+[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
有没有办法将 BsonIgnoreExtraElements
+应用于所有的类呢?
当然有,其方法如下,只需要在初始化 MongoClient
+之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
// mongodb 全局设置 |
++ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions +中
+
-
+
IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户 +Collection +中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
+IgnoreIfNullConvention:如果字段 +
null
,则不存这个字段,简单来说就是省空间,假设一个类中有 +A,B
两个字段,其中A
+字段为空,如果指定该设置,存为{B:'B'}
,否则,存为 +{A:null, B:'B'}
。
+
参考
+ +]]>BsonIgnoreExtraElements
特性,即可解决。
-
-正文
-假设有如下 mongodb 数据:
-[ |
数据库对应的类的定义为:
-[BsonIgnoreExtraElements] |
为了使 mongodb 在映射到 Person
时不报错,要在
-Person
上添加 [BsonIgnoreExtraElements]
-特性。
--BsonIgnoreExtraElements 位于命名空间 -MongoDB.Bson.Serialization.Attributes 中
-
这种方式有个弊端,如果要在每一个类上添加
-[BsonIgnoreExtraElements]
,那写代码时简直难受,且代码侵入性很大。
有没有办法将 BsonIgnoreExtraElements
-应用于所有的类呢?
当然有,其方法如下,只需要在初始化 MongoClient
-之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。
// mongodb 全局设置 |
--ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions -中
-
-
-
IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户 -Collection -中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。
-IgnoreIfNullConvention:如果字段 -
null
,则不存这个字段,简单来说就是省空间,假设一个类中有 -A,B
两个字段,其中A
-字段为空,如果指定该设置,存为{B:'B'}
,否则,存为 -{A:null, B:'B'}
。
-
参考
- -]]>到目前为止,vue3 中的 setup
+本身不能是异步函数,因此我们如果需要使用 async
+函数,要将异步操作包装起来。可以通过以下方式实现:
方法一:使用 suspense
+使用suspense 包裹你的组件,然后使用
+async setup()
。这种方式目前为实验性功能,不稳定。
<Suspense> |
方法二:使用生命周期钩子
+可以在生命周期钩子中调用异步方法:
+<script> |
方法三:将调用包裹在异步函数中
+该方法与 方法二 原理相同:
+<template> |
参考
+本文参考了以下文章,在此报以诚挚谢意!
+ +]]>-
+
- 组件间的父子之间的传值 +
- 组件间的子父之间的传值 +
- 非组件间的组件间的传值(简称:EventBus) +
- sessionStorage 缓存传值 +
- 路由带参数跳转进行传值 +
- vuex 进行传值 +
组件间的父子之间的传值
+思路:父组件调用子组件 dom +位置声明一个名称,然后在子组件接收这名称,便可直接调用。
+-
+
- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件): +
-
+
- 子组件: +
组件间的子父之间的传值
+思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
+-
+
- 子组件: +
-
+
- 父组件: +
非组件间的组件间的传值(简称:EventBus)
+先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器 +(eventBus.js) 让其他房子接收到信号(组件B)
+思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
+import Vue from 'vue' |
-
+
- 组件A: +
-
+
- 组件 B: +
效果展示如下:
+ + +sessionStorage 缓存
+-
+
- 组件 A: +
-
+
- 组件 B: +
路由带参数跳转
+-
+
- 组件 A:有路由默认的页面 +
-
+
- 组件 B:路由其他页面 children +
效果如下:
+ + +vuex +主要做数据交互,维护公共状态或数据
+官方网站:Vuex
+多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
+ +src下创建一个store的文件夹,里面创建index.js文件
+import Vue from 'vue' |
某文件触发事件
+methods: { |
展示页面
+<h1>{{this.$store.state.city}}</h1> |
致谢
+本文摘抄至:vue通信及组件之间传值
+]]>到目前为止,vue3 中的 setup
-本身不能是异步函数,因此我们如果需要使用 async
-函数,要将异步操作包装起来。可以通过以下方式实现:
方法一:使用 suspense
-使用suspense 包裹你的组件,然后使用
-async setup()
。这种方式目前为实验性功能,不稳定。
<Suspense> |
方法二:使用生命周期钩子
-可以在生命周期钩子中调用异步方法:
-<script> |
方法三:将调用包裹在异步函数中
-该方法与 方法二 原理相同:
-<template> |
参考
-本文参考了以下文章,在此报以诚挚谢意!
- +本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
+当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
+最后,再次感谢 answershuto 的 learnVue。
]]>-
-
- 组件间的父子之间的传值 -
- 组件间的子父之间的传值 -
- 非组件间的组件间的传值(简称:EventBus) -
- sessionStorage 缓存传值 -
- 路由带参数跳转进行传值 -
- vuex 进行传值 -
组件间的父子之间的传值
-思路:父组件调用子组件 dom -位置声明一个名称,然后在子组件接收这名称,便可直接调用。
--
-
- 父组件(谁是父组件个人理解:谁引用谁的组件,谁就是父组件): -
-
-
- 子组件: -
组件间的子父之间的传值
-思路:在子组件通过触发一个事件带值,让父组件接受这个事件,解析这个值
--
-
- 子组件: -
-
-
- 父组件: -
非组件间的组件间的传值(简称:EventBus)
-先用例子来解释下组件间的关联:组件 A 比作一个路由器,通过中继器 -(eventBus.js) 让其他房子接收到信号(组件B)
-思路:首先在src目录下创建一个eventBus.js文件,复制这行代码进去
-import Vue from 'vue' |
-
-
- 组件A: -
-
-
- 组件 B: -
效果展示如下:
- - -sessionStorage 缓存
--
-
- 组件 A: -
-
-
- 组件 B: -
路由带参数跳转
--
-
- 组件 A:有路由默认的页面 -
-
-
- 组件 B:路由其他页面 children -
效果如下:
- - -vuex -主要做数据交互,维护公共状态或数据
-官方网站:Vuex
-多看几遍这图,vuex 基本就会使用,多加运用就会更加熟练。
- -src下创建一个store的文件夹,里面创建index.js文件
-import Vue from 'vue' |
某文件触发事件
-methods: { |
展示页面
-<h1>{{this.$store.state.city}}</h1> |
致谢
-本文摘抄至:vue通信及组件之间传值
-]]>有两个办法解决上面的问题:
--
-
- 用 computed 属性 -
本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应 -state -中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
--
-
- 用 watch 属性 -
直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda -表达式,而是要使用完整的方法定义,见下面的代码:
-watch: { |
本文记录了在学习过程中的一些个人见解,同时,对于以前未涉及的知识点作一个总结和记录,以便今后回顾,如果也有小白恰好看到了这篇文章,希望也能帮到你,节省一些查找资料的时间。
-当然,我所理解的可能会存在偏差,欢迎提留言指出,共同学习,共同进步。
-最后,再次感谢 answershuto 的 learnVue。
-]]>有两个办法解决上面的问题:
+-
+
- 用 computed 属性 +
本方案有个缺陷,就是如果在组件内的模板区域内没有使用该计算属性,它是不会响应 +state +中值的变化的,而本项目就遇到了这个坑,后面采用下面的方法解决了。
+-
+
- 用 watch 属性 +
直接 watch state 里面的属性值,这里也有一个注意的地方,不能使用 lamda +表达式,而是要使用完整的方法定义,见下面的代码:
+watch: { |