引用

revit坐标与屏幕坐标的转换

前置

关于Revit中楼梯竖向标注的问题记录及生成方式的解决方案

样式


内容

上面链接文件中提供了一种屏幕坐标转换为项目坐标的办法,原理时通过屏幕中的点与边界的比例换算到项目中计算得出,但是博主的方法只适用于XY平面的情况下,如果应用到剖面中就无法满足了,剖面会出现正交剖面及平行XY轴切割或是斜向剖面,所以下面的使用了博主的思想修改了一下方法

  1. 首先分析剖面视图,可以看作横向与纵向,纵向仅代表Z值,横向代表(X,Y)值,但是横向面会出现旋转偏移,可以把这个看作小时候转的皮蜻蜓一样,其次我们再Revit中看到的剖面视图其实是斜剖面对于屏幕的投影
  2. 我们获取到点击的屏幕坐标时,会获得屏幕的(X,Y)点,然后获得Revit工作空间的屏幕Rectangle,从而求出XY再空间中的比例
    • 这里遇到两个情况,记录一下此处我最先想用UV换算,但是有个问题 无法获得View的BoudingBoxUV所以做吧
    • 后来直接用比例计算,但还是斜剖面的问题,此时斜剖面两个ZoomCorns代表一个立方体所以无法直接通过比例换算
    • 之后想通过Transform换算坐标,但是我们无法获取转换的三维点,因为屏幕的二位点只能给我们提供一个准确的Z值
  3. 此时因为对三维降维为XY平面操作,所以只需要考虑左边还是右边,因为Revit的特性所以Corns[0]代表左侧,1代表右侧,这是我们可以将两个相同Z值的点连接成为向量,将横向X比例带入Vector运算即可获得横向的XY值,结合起来便是准确的三维坐标
  4. 通过前三步加上一个透明的窗口点击界面即可实现用户选择竖向标注位置自动生成楼梯标注的功能,这个说起来也不是复杂只是自己一开始钻到矩阵运算的解决办法之中,绕了弯路。

码一篇现代的教程,对矩阵有着很清晰的讲解,看完这个会对矩阵运算有更深的理解
线性代数课程:线性代数的本质

代码

屏幕坐标到Revit坐标 , 仅适用于剖面,平面使用上面博主的即可

/// <summary>/// 屏幕坐标转换为项目坐标/// </summary>/// <param name="screenPoint"></param>/// <returns></returns>private XYZ Screen2ViewPlan(UIView uiView,System.Drawing.Point screenPoint){/** 由于剖面的方向具有不确定性,所以不能简单的返回XY坐标* 可以通过屏幕工作区域的坐标计算左上角的坐标位置,返回屏幕坐标与点击窗口屏幕坐标做对照* 通过屏幕数值的对比计算实际的对比* 参考链接:https://blog.csdn.net/w051108/article/details/107723510*///屏幕坐标var rect = _uiView.GetWindowRectangle();//屏幕比例double sWidth = rect.Right - rect.Left;double sHeight = rect.Bottom - rect.Top; // Y值从上到下依次递增double widthScale = (screenPoint.X - rect.Left) / sWidth;double heightScale = (rect.Bottom - screenPoint.Y) / sHeight;//此处如果是斜剖面视图,需要使用普通界面接收一下相应位置//此处只需要区分左右,并不是所有的视图都是左下和右上两个角var corners = _uiView.GetZoomCorners();XYZ wRight = corners[1];XYZ wLeft = corners[0];//var referVector = (corners[0] - corners[1]).Normalize();//var referAngle = referVector.AngleTo(XYZ.BasisX);//if ((referAngle >= 0 && referAngle < 0.5 * Math.PI) ||//    (referAngle >= 1.5 * Math.PI && referAngle <= 2 * Math.PI))//{//    wRight = corners[1];//    wLeft = corners[0];//}//else//{//    wRight = corners[0];//    wLeft = corners[1];//}//类似皮搋子样式的三维旋转算法var fakeTransform = Transform.Identity;/** 先降维后分别计算之后组合即可成为三维坐标* 此算法适用所有剖面区域,通过将Z值统一从而将两个三维对焦点变为二维面* 两个点连成线之后通过工作平面与点击点的横向比例找出二维XY面上的点* 竖向比例可求出Z值,组合后即可求出XYZ三维坐标*///首先将Z降级,降到统一Z值var MoveReferPoint = new XYZ(wRight.X,wRight.Y,wLeft.Z);var referLine = Line.CreateBound(wLeft, MoveReferPoint);var referNormalVector = referLine.Direction;var sPoint = wLeft + (MoveReferPoint - wLeft) * widthScale;var baseHeight = wRight.Z - wLeft.Z > 0 ? wLeft.Z : wRight.Z;var referHeight = Math.Abs(wRight.Z - wLeft.Z);var rPoint = new XYZ(sPoint.X,sPoint.Y,baseHeight + referHeight*heightScale);//             double wWidth = wRightTop.X - wLeftBottom.X;//double wHeight = wRightTop.Y - wLeftBottom.Y;//double widthDis = wWidth * widthScale;//double heightDis = wHeight * heightScale;//var pointXY =  new XYZ(wLeftBottom.X + widthDis, wLeftBottom.Y + heightDis, 0);return rPoint;}

Revit二次开发 自动生成剖面楼梯标注相关推荐

  1. Revit二次开发——自动生成构件图(总结)

    之前测试导出构件图的功能实现,拆分了各模块分布进行测试: Revit二次开发--一键导出构件图(1) Revit二次开发--叠合板自动配筋(2) Revit二次开发--自动标注钢筋思路(3) 本篇为这 ...

  2. cad通过钢筋大样生成钢筋明细表插件_Revit二次开发——自动生成构件图(总结)...

    之前测试导出构件图的功能实现,拆分了各模块分布进行测试:Revit二次开发--一键导出构件图(1) Revit二次开发--叠合板自动配筋(2) Revit二次开发--自动标注钢筋思路(3) 本篇为这个 ...

  3. 陈伯雄lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图

    龙源期刊网 http://www.qikan.com.cn 基于 AutoLisp 的 AutoCAD 二次开发自动 生成系统图 作者:郎建山 金江 来源:<科技视界> 2013 年第 2 ...

  4. CAD自控lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图

    基于 AutoLisp 的 AutoCAD 二次开发自动生成系统图 [摘 要]本文主要阐述了应用 autolisp 语言二次开发 autocad 自动生成系统图的实现方案. [关键词] autocad ...

  5. Revit二次开发——自动标注轴网

    引言:在自动标注大主题下,自动标注轴网:利弊等望读者自行改进(仅限平面视图) 开始: using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; ...

  6. Revit二次开发-自动线性尺寸标注

    在这里就不多说什么,直接上主要代码,分享给大家,希望对各位有帮助,有更好的意见的也欢迎大家留言. /// <summary>/// 自动创建所选中的一组图元的线性距离尺寸/// </ ...

  7. Revit二次开发——自动标注钢筋思路(3)

    仍然是接上一篇 本篇分析标注钢筋的思路 (另:构件图思路分享系列的阅读顺序是2-3-1) 测试环境visual studio2017 + revit2016 demo: 实现思路: 测试时,首先想到的 ...

  8. Revit二次开发案例一(第1讲)

    这期起,将为大家带来二次开发的小案例讲解,通过借助Revit建模与二次开发,帮助大家快速提高开发水平,快快参加吧!!! 族实例是通过族类型创建的,而创建族实例是Revit二次开发尤其重要的,因此小伙伴 ...

  9. Revit二次开发——结构模型构件自动扣减

    **Revit二次开发实例--模型自动扣减** 本文章来源于微信公众号 '有福BIM' 有福BIM的第四篇原创文章! 阅读前望知悉: 我晓得各位读者和粉丝中不乏C#二开大佬 有福作为一个二开新手(编程 ...

最新文章

  1. 电脑销售技巧_汝州市,如何查询楼盘详细销售数据?官方公布,精确到房间
  2. package-lock.json 文件的作用
  3. Java基础学习总结(151)——Java 8时间处理API再复习
  4. Google 搜索老矣,尚能饭否?
  5. 谷歌AI相机Clips今发售,“贴身摄影师”抓拍每一刻欢乐
  6. 使用yum命令时Error: Cannot find a valid baseurl for repo: base
  7. PHP类中Static方法效率测试
  8. 在下层捕获上层抛出的异常
  9. php $stomp write byte message,PHP通过Stomp协议与,ActiveMQ,通信所遇到的问题
  10. 凸优化第二章凸集 2.5分离与支撑超平面
  11. java的实例变量_JAVA语言中的实例变量
  12. 美团团购订单系统优化记
  13. 简易银行管理系统(C语言)
  14. python中sorted函数逆序_python中sorted函数
  15. 微信公众号授权 提示内容与下载文件不符,请检查文件内容或重新上传
  16. c语言用函数实现二分查找
  17. 【软件通信协议】1. 详细解析TCP/IP通信协议
  18. 云和恩墨数据库人才招聘
  19. win10系统的计算机C盘在哪,win10系统电脑C盘programdata在哪的图文办法
  20. java移位运算符详解

热门文章

  1. 小白学编程千万别踩这 4 个坑!| 原力计划
  2. word2003用不了搜狗输入法
  3. Revit (2) - CAD - 获取CAD文字
  4. uniapp实现简易计算器
  5. 一元函数的插值c语言,一元函数插值-Read.doc
  6. 快手大数据挑战赛---总结
  7. GBD+ | 绿色经济与产业链互联网之关系——进击的文创?
  8. 【完美解决】Win11遇到无法删除的文件怎么办?Win11如何强制删除文件?
  9. wubi安装ubuntu14.04
  10. 一个游戏大量合服代表什么_逆水寒大量服务器合并说明游戏凉了吗