童年原是一生最美妙的阶段,那时的孩子是一朵花,也是一颗果子,是一片懵懵懂懂的聪明,一种永远不息的活动,一股强烈的欲望。——巴尔扎克
    • 使用ThreeJs搭建BIM模型浏览器 第四步 剖切

      转载2020-10-160评论11377
      技术方案:threejs的剖切,是由renderer.clippingPlanes实现的。 this.clipHelpers = new THREE.Group(); this.clipHelpers.add(new THREE.AxesHelper(20)); this.globalPlanes = new THREE.Plane(new THREE.Vector3(1, 0, 0), 0); this.clipHelpers.add(new THREE.PlaneHelper( this.globalPlanes, 20, 0xff0000)); this.clipHelpers.visible = false; this.scene.add(this.clipHelpers); //创建一个剖切面 this.renderer.clippingPlanes = this.globalPlanes; // 显示剖面 this.renderer.localClippingEnabled = true; this.globalPlanes.constant = 5;//这个数值的变化将引起剖面的移动 效果如下:
    • 使用ThreeJs搭建BIM模型浏览器 第三步 浮标

      转载2020-10-160评论11579
      实现效果如下。不用纠结UI为什么很面熟,因为我从某大品牌抄过来的,哈哈。 实现原理呢, 第一步,获取鼠标点击。 第二步,计算交插点。(这里要注意,如果是剖切之后,被剖切部分要舍弃,否则标记在隐藏构件上。 第三步,三维点转二维点。 第四部,在二维点中画一个div,样式控制为标记。  核心代码: 1、获取点击。请上看一遍文章。 2、三维转二维: //三维座转二维的计算。 toScreenPositionOfVector(x, y, z) { var vector = new THREE.Vector3(x, y, z); //calculate screen half size var widthHalf = 0.5 * this.renderer.context.canvas.width; var heightHalf = 0.5 * this.renderer.context.canvas.height; vector.project(this.camera); //get 2d position on screen vector.x = (vector.x * widthHalf) + widthHalf; vector.y = -(vector.y * heightHalf) + heightHalf; return { x: vector.x, y: vector.y }; } 3、增加标记的div AddRedMark(x, y, z) { var position = this.toScreenPositionOfVector(x, y, z); var adiv = document.createElement('div'); adiv.classList.add("redmark"); adiv.style.position = "absolute"; document.body.appendChild(adiv); adiv.innerHTML = '<img src="css/led_red.png" class="zoom" style="position: absolute;">'; adiv.style.display = ""; adiv.style.left = (position.x - 16) + 'px'; adiv.style.top = (position.y - 32) + 'px'; var markObj = { position: [x, y, z], mark: adiv }; this.redMarkDivs.push(markObj); }  
    • 使用ThreeJs搭建BIM模型浏览器,第二步-构件选择

      转载2020-10-160评论11229
      构件选择其实是鼠标点选的二维坐标与Canvas上的视角方向做射线投影,所穿过的所有构件,第1个即为点选。 以下为代码逻辑。部分变量可以根据您的需要,修改成你的变量。点击后把构件设置为半透明。 如果有需要,还可以在点击位置放一个标记。如isAddMark示意。 this.components 为所有构件的数组。 this.selComps 用来保存被点击的构件。 mouseUp(event) { var vector = new THREE.Vector3((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1, 0.5); vector = vector.unproject(this.camera); var raycaster = new THREE.Raycaster(this.camera.position, vector.sub(this.camera.position).normalize()); var intersects = raycaster.intersectObjects(this.components); console.log(intersects) if (this.selComps.length > 0) { this.selComps[0].object.material.transparent = false; this.selComps[0].object.material.opacity = 1; this.selComps = []; } if (intersects.length > 0) { // console.log(intersects[0]); intersects[0].object.material.transparent = true; intersects[0].object.material.opacity = 0.5; this.showLog('点击' + intersects[0].object.uuid); //点击到的位置:intersects[0].point; if (this.isAddMark) { //todo 对标记进行监管。 viewer.sphere(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z,0xFF0000,0.7); } this.selComps.push(intersects[0]); this.showProperty(intersects[0].object.rid); } }     如下图,点选一个门   在点击的焦点处放一个红色的气泡(请专家们不要纠结气泡太丑,没有时间去做浮标)。在BIM协同的时候,肯定会有类似的需求。
    • 使用ThreeJs搭建BIM模型浏览器,第一步-显示

      转载2020-10-160评论11135
      threejs既然能够通过三角面构造mesh,肯定是能够通过面片构造出几何模型。各个功能模块的核心代码,在我后续的博客中会一一列举公布出来。 实现思路: 1、从Revit中导出族名称+构件三角面+构件属性的JSON文本,并压缩成Zip。有朋友问是否需要二次开发。当然是要的,具体可以查看我发布的其他文章,有公开的Demo。 2、Web端解压ZIP,并加载JSON。整个打包解压过程自己定义,不采用第三方文件的优势是,解析过程可以优化,内容也可以根据模型的精细级别进行优化。 以下是文件定义举例。大家在实现的时候根据自己需求去定义,不用刻意模仿。JSON中重复的字段,名称取短一点对文件压缩有很大提升。比如Face直接命名为:"F",自己定义就不太需要考虑可读性。 我的作品,几乎能做到市面上浏览器的所有常见功能。例如漫游、点选、框选、显示隐藏、透明度、标注、测量。下面是模型的展示入口:模型展示页,从里面也可以下载到一些入门级的Revit插件代码和Threejs的示例代码。  ++ {"Faces":[{"obj":null,"Tgs":["0,1,2","3,4,5","6,7,8","9,0,10","10,0,2","9,10,7","7,11,3","11,7,10","3,11,4","9,7,6"],"Uvset":["10,11,0","5,3,4","8,6,7","9,10,1","1,10,0","9,1,6","6,2,5","2,6,1","5,2,3","9,6,8"],"Nor":"0,0,-1","MtrId":0},{"obj":null,"Tgs":["12,13,14","13,12,15","12,14,16","17,16,18","16,17,12","17,18,19","14,20,16","21,13,15","22,19,18","20,23,16"],"Uvset":["23,14,15","14,23,12","23,15,18","22,18,19","18,22,23","22,19,21","15,16,18","13,14,12","20,21,19","16,17,18"],"Nor":"0,0,1","MtrId":0},{"obj":null,"Tgs":["2,15,12","12,10,2"],"Uvset":["24,26,27","27,25,24"],"Nor":"0,-1,0","MtrId":0},{"obj":null,"Tgs":["10,12,17","17,11,10"],"Uvset":["24,26,29","29,28,24"],"Nor":"-1,0,0","MtrId":0},{"obj":null,"Tgs":["11,17,19","19,4,11"],"Uvset":["24,26,31","31,30,24"],"Nor":"0,1,0","MtrId":0},{"obj":null,"Tgs":["4,19,22","22,5,4"],"Uvset":["24,26,33","33,32,24"],"Nor":"1,0,0","MtrId":0},{"obj":null,"Tgs":["5,22,18","18,3,5"],"Uvset":["24,26,35","35,34,24"],"Nor":"0,-1,0","MtrId":0},{"obj":null,"Tgs":["3,18,16","16,7,3"],"Uvset":["24,26,37","37,36,24"],"Nor":"1,0,0","MtrId":0},{"obj":null,"Tgs":["7,16,23","23,8,7"],"Uvset":["24,26,39","39,38,24"],"Nor":"0,1,0","MtrId":0},{"obj":null,"Tgs":["8,23,20","20,6,8"],"Uvset":["24,26,41","41,40,24"],"Nor":"1,0,0","MtrId":0},{"obj":null,"Tgs":["6,20,14","14,9,6"],"Uvset":["24,26,39","39,38,24"],"Nor":"0,-1,0","MtrId":0},{"obj":null,"Tgs":["9,14,13","13,0,9"],"Uvset":["24,26,43","43,42,24"],"Nor":"1,0,0","MtrId":0},{"obj":null,"Tgs":["0,13,21","21,1,0"],"Uvset":["24,26,45","45,44,24"],"Nor":"0,1,0","MtrId":0},{"obj":null,"Tgs":["1,21,15","15,2,1"],"Uvset":["24,26,47","47,46,24"],"Nor":"1,0,0","MtrId":0}],"Pt":["56.721771,36.437252,-1","217.221771,36.437252,-1","217.221771,-0.500246,-1","56.721771,139.916428,-1","122.221771,176.937256,-1","122.221771,139.916428,-1","78.910057,53.958088,-1","56.721771,74.312256,-1","78.910057,74.312256,-1","56.721771,53.958088,-1","0.242604,-0.500246,-1","0.242604,176.937256,-1","0.242604,-0.500246,0","56.721771,36.437252,0","56.721771,53.958088,0","217.221771,-0.500246,0","56.721771,74.312256,0","0.242604,176.937256,0","56.721771,139.916428,0","122.221771,176.937256,0","78.910057,53.958088,0","217.221771,36.437252,0","122.221771,139.916428,0","78.910057,74.312256,0"],"UVs":["-143.635417,0","73.34375,0","73.34375,177.4375","-48.635417,177.4375","-48.635417,140.416667","16.864583,140.416667","16.864583,74.8125","-5.323707,74.8125","-5.323707,54.458333","16.864583,54.458333","16.864583,36.9375","-143.635417,36.9375","143.635417,0","143.635417,36.9375","-16.864583,36.9375","-16.864583,54.458333","5.323707,54.458333","5.323707,74.8125","-16.864583,74.8125","-16.864583,140.416667","48.635417,140.416667","48.635417,177.4375","-73.34375,177.4375","-73.34375,0","0,0","0,216.979167","1,0","1,216.979167","0,177.4375","1,177.4375","0,121.979167","1,121.979167","0,37.020833","1,37.020833","0,65.5","1,65.5","0,65.604167","1,65.604167","0,22.18829","1,22.18829","0,20.354167","1,20.354167","0,17.520833","1,17.520833","0,160.5","1,160.5","0,36.9375","1,36.9375"],"LevelId":30,"CatId":-2001263,"Id":169141,"Colors":["0"]}   以下是效果图。样式不是重点,随时可以换。        
    • 使用ThreeJs搭建BIM模型浏览器 QModel的诞生记

      转载2020-10-160评论10817
      QModel模型浏览器展示页面:QModel链接入口,支持Revit文件上传,在Web端浏览,并集成与模型相关的业务。 首先关于笔者的介绍: 2010年机缘巧合进行建筑信息化行业,当时主要还是在做工程造价相关的软件。 2015年BIM概念忽然兴趣,随公司开始做一些跟Revit相关的项目,从此对Revit二次开发有一定的了解。 2016年Web端并没有很好的解决方案,做了一些跟BIM相关的桌面端应用。 2017年BIM平台开始火了,转做平台项目,自然而然成为了前后端的全栈工程师,掌握了.NET Core和Angular 2018年因为平台做大,框架转变为Java的微服务框架,逐渐跟上了主流。 整个做BIM的过程,就是跟模型打交道的过程。研究过国内外许多做模型的引擎,集成度高业务全面的大厂贵的要死,老外的产品跟国内使用习惯差异巨大,我也曾在沟通上吃尽苦头。 2019年辞去了做了9年的工作。   关于QModel的诞生: 很有意思。是在我做了许多年的开发工程师,开发经理之后,终于因为某些机缘下退居二线,成为产品经理,日常工作更多的是做BIM平台产品规划,原先掌握的技术已经全部用不上了。但是我不太甘心呀!于是开始了Threejs的学习之路。此时的我虽然技术不怎么牛,但是我的全栈在建筑行业已经达100%全栈,从设计到施工运维全过程的业务都有所了解,而且开发所要用的技术都心中有数。Revit解析几何不算太难,而Threejs官方的示例确实非常的全,对我来说看懂也并非难事。头脑一热,从官方Down下来示例代码,开始了QModel的第一个架子:如何显示一个自定义体。历时近一年,都是业余时间的研究,终于有点东西了。耗时最长的一个问题,就是UV信息如何导出,转换到Threejs的UV上把图贴正确。   关于QModel的命名: 很简单,轻量化模型,取轻拼音字母Q。   关于QModel的规划: 把视点、标准都设计为平台化的功能。 把性能再提升一个等级,尝试渐进式加载和离屏渲染,多线程。 在二维图纸上有所突破。 注册个小公司。这是一个不以盈利为目的引擎平台,支持免费接入,只要流量上去,愿意给钱的给点赞助费维护服务器。   关于QModel的框架: 目前是这样,以后可能还会变   以下是平台展示网页:http://www.qmodel.cn    
    • 解决Navicat还原出现Finished - Stopped before completion的问题

      2020-9-250评论11138
      今天还原数据库的时候失败报 [Msg] Finished - Stopped before completion 查看数据库中最大的单个文件容量 SHOW VARIABLES LIKE '%max_allowed_packet%'; 设置最大单个文件容量,单次有效(新建查询---运行) SET GLOBAL max_allowed_packet=2010241024; 在还原备份即可
    • mysql5.7在windows下面的主从复制配置

      建站知识2020-8-170评论11815
      目标:自动同步Master 服务器上面的Demo数据库到Slave 服务器的Demo数据库中。 对于一些操作系统比较强而使用频率又不高的东西,往往好久不去弄就忘记了,所以要经常记录起来,方便日后查阅。 环境 数据库版本:mysql5.7.17 Master 服务器(Windows server2012 R2):192.168.1.18  Slave 服务器 (win7 64bit):192.168.1.95 mysql5.7.17 winx64免安装版下载地址:http://dev.mysql.com/downloads/file/?id=467269 具体配置方法请参考:https://www.cnblogs.com/c3gen/p/6168765.html 工具:Cmder(window神器)。你也可以直接用window的CMD。 注意:主从服务器的防火墙都要给mysql端口添加例外。也就是说两台服务器的mysql数据库可以互连。 修改配置文件 主库 开始——运行—services.msc,打开主库的服务列表,找到服务MYSQL57 ,查看该服务的配置文件所在路径。 打开配置文件my.ini,添加如下配置项 log-bin=mysql.bin # 使binlog在每N次binlog写入后与硬盘同步 sync-binlog=1 # 1天时间自动清理二进制日志 expire_logs_days=1 # 需要同步的数据库 binlog-do-db=demo # 不需要同步的数据库 binlog-ignore-db = mysql binlog-ignore-db = test binlog-ignore-db = information_schema binlog-ignore-db = bak binlog-ignore-db = sys binlog-ignore-db = omserver binlog-ignore-db = sakila binlog-ignore-db = smp_base_1_0 binlog-ignore-db = smp_base_2 binlog-ignore-db = smp_emx_1_0 binlog-ignore-db = smp_emx_2 binlog-ignore-db = smp_maint_1_0 binlog-ignore-db = smp_maint_2 # Error Logging. log-error="WIN-1QQDRPR5R2M.err" # Server Id. server-id=1 主服务器上面有很多数据库,而我们只需要同步其中一个数据库demo。 从库 以同样的方式找到并打开mysql数据库配置文件my.ini。 修改配置如下: # Server Id. server-id=95 # bind-address=192.168.1.95 log_bin=mysql-bin # 二进制日志自动删除的天数 expire_logs_days=1 需要注意的是:主库和从库的Server Id不能相同,通常我们将其设置为IP地址的末尾数值,假如IP是192.168.1.95,那么我们设置95. 命令操作 主库 1.连接到主库 mysql -h 192.168.1.18 -uroot -p 2.创建授权用户 grant replication slave on *.* to 'test'@'192.168.1.95' identified by 'yujie' ; 说明:test是mysql用户名,yujie是密码,192.168.1.95是从库的IP地址。 3. 刷新权限 flush privileges;   6.创建测试数据 create database test; use test; create table test(id int(11), value varchar(20)); insert into test values(1, 'aa'),(2, 'bb'),(3, 'cc') ,(4, 'dd') ,(5, 'ff') ,(6, 'gg') ,(7, '77'); 7. 显示主服务器的状态信息,并且找到File 和 Position 的值记录下来 从库 1.登录从库 mysql -uroot -p 2 .将主库的demo数据库克隆一份到从库,并给test用户重新赋权限。 grant all privileges on *.* to 'test'@'%' identified by 'yujie' with grant option; 3.重启mysql服务 4.slave 与 master 建立连接,进行数据同步 change master to master_host='192.168.1.18',master_user='test',master_password='yujie', master_log_file='mysql.000001',master_log_pos=937; 注意这里的master_log_file和master_log_pos的值就是前面在主库中查到的File和Position。 5.查看从数据库状态 show slave status \G; Slave_IO_Running: Yes Slave_SQL_Running: Yes以上两项都为Yes说明配置成功。 验证主从 在master 插入一条数据,然后再slave查看是否同步成功。 主库: mysql> use demo; Database changed mysql> insert into test values(8, '88'); Query OK, 1 row affected (0.14 sec) 从库: mysql> use demo; Database changed mysql> select * from test; +------+-------+ | id | value | +------+-------+ | 1 | aa | | 2 | bb | | 3 | cc | | 5 | ff | | 6 | gg | | 7 | 77 | | 8 | 88 | +------+-------+ 7 rows in set (0.00 sec) 如上图表示同步成功。 其实在mysql5.7之后还有另一种复制方式,那就是基于事务的复制,并且你可以在这两种复制方式之间进行切换,我这里只演示了通过二进制日志的形式进行复制。 参考资料: mysql-5.7.17-winx64免安装版,win10环境下安装配置:https://www.cnblogs.com/c3gen/p/6168765.html mysql 5.7 主从同步配置(windows):https://blog.csdn.net/natahew/article/details/71122569 MySQL5.7 主从复制配置:https://segmentfault.com/a/1190000010199283
    • 常用服务器管理口IP及账号密码(欢迎补充)

      2020-5-160评论15871
      文章包含各种型号的服务器管理口的ip地址大全,以便于我们方便访问服务器的相关日志,管理硬件信息,远程登录等等 HP管理口:ILO 默认用户/密码:Administrator/password HP以前管理口登陆MP卡 通过网线连接MP卡的RJ-45口,通过telnet方式登录,默认用户/密码:Admin/Admin DELL服务器管理口:idac 默认账号:root 密码:calvin IP:192.168.0.120 IBM管理口:IMM RD系列lenovo/len0vO 默认地址:192.168.70.125 默认用户/密码:USERID/PASSW0RD 联想服务器管理口 联想 thinkserver RQ940 管理口IP192.168.0.120 账户/密码:admin/admin rd350 IP:192.168.70.125 账号密码:USERID/PASSW0RD 浪潮管理口:IPMI 默认用户/密码:admin/admin 浪潮AS5300/5500 默认 IP 为 192.168.1.1 管理软件登录用户名默认,密码为root 浏览器登录用户名默认,密码为空 浪潮AS5600 默认 IP 为 192.168.1.1 浏览器登录默认用户名:superuser 密码:passw0rd brocade 博科交换机 默认IP:10.77.77.77 通过telnet方式登录255.255.255.0 默认用户与密码:admin/password 最高权限 root/fibranne(恢复出厂密码) 串口登录 恢复出厂密码命令:passwddefault (root用户下) EMC vnx5300 管理IP: 默认SPA:1.1.1.1 SPB:1.1.1.2 维护IP: 默认SPA:128.221.1.250 SPB:128.221.1.251 子网掩码:255.255.255.248 默认用户名/密码 admin/password 爱数一体机vx1210 em1网卡默认IP为192.168.0.253 管理口默认IP:192.168.2.100 默认用户与密码:root/Huawei12#$ PS:欢迎大家留言区补充~
    • MySQL This function has none of DETERMINISTIC, NO SQL...错误1418 的原因分析及解决方法 (转)

      2020-4-290评论12417
      解决方法: 解决办法也有两种, 第一种是在创建子程序(存储过程、函数、触发器)时,声明为DETERMINISTIC或NO SQL与READS SQL DATA中的一个, 例如: CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`()     DETERMINISTIC BEGIN #Routine body goes here... END;; 第二种是信任子程序的创建者,禁止创建、修改子程序时对SUPER权限的要求,设置log_bin_trust_routine_creators全局系统变量为1。 设置方法有三种: 1.在客户端上执行SET GLOBAL log_bin_trust_function_creators = 1; 2.MySQL启动时,加上--log-bin-trust-function-creators选贤,参数设置为1 3.在MySQL配置文件my.ini或my.cnf中的[mysqld]段上加log-bin-trust-function-creators=1
    • Windows server 2012公用网络修改为专用网络

      2020-4-90评论12962
      普通环境路径如下: 【控制面板】--【系统和安全】--【管理工具】--【本地安全策略】--【网络列表管理器策略】--【网络】--【网络位置】,设定之后也可以设定一下【用户权限】   域控环境路径如下: 不像Windows Server 2003 ,Windows Server 2012 域控制器的管理工具中没有“域安全策略”,修改域策略在新的“组策略管理”中: 开始> 控制面板 > 系统和安全 > 管理工具 > 组策略管理(或者用命令 gpmc.msc) > 林 [domain] > 域 > [domain] > Default Domain Policy > 点击右键,编辑,打开“组策略管理编辑器” > 计算机配置 > 策略 > Windows 设置 > 安全设置 > 网络列表管理器策略 > 网络 > 网络位置 , 修改之后如未生效,可以通过命令 gpupdate 来刷新组策略。
    
    sitemap