找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2240|回复: 2

[分享] 直线与平面交点

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2014-9-23 19:01:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
写了个 LispFunction ,很简单,
(linetoplane p1 p2 p3 p4 p5)
p1 p2 为线上两点, p3 p4 p5 为i构成平面的非共线三点

  1. // (C) Copyright 2014 by  
  2. using System;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using Exception = System.Exception;

  9. [assembly: CommandClass(typeof(AutoCAD_CSharp_plug_in34.MyCommands))]

  10. namespace AutoCAD_CSharp_plug_in34
  11. {
  12.     public class MyCommands
  13.     {

  14.         [LispFunction("LineToPlane")]
  15.         public object MyLispFunction(ResultBuffer args) // This method can have any name
  16.         {
  17.             TypedValue[] vars = args.AsArray();
  18.             if (vars != null && vars.Length == 5
  19.                 && vars[0].TypeCode == (int)LispDataType.Point3d
  20.                 && vars[1].TypeCode == (int)LispDataType.Point3d
  21.                 && vars[2].TypeCode == (int)LispDataType.Point3d
  22.                 && vars[3].TypeCode == (int)LispDataType.Point3d
  23.                 && vars[4].TypeCode == (int)LispDataType.Point3d)
  24.             {
  25.                 Document doc = Application.DocumentManager.MdiActiveDocument;
  26.                 Database db = doc.Database;
  27.                 Transaction tr = db.TransactionManager.StartTransaction();
  28.                 using (tr)
  29.                 {
  30.                     try
  31.                     {
  32.                         Point3d p1 = (Point3d)vars[0].Value;
  33.                         Point3d p2 = (Point3d)vars[1].Value;
  34.                         Point3d p3 = (Point3d)vars[2].Value;
  35.                         Point3d p4 = (Point3d)vars[3].Value;
  36.                         Point3d p5 = (Point3d)vars[4].Value;
  37.                         Line3d ln = new Line3d(p1, p2);
  38.                         Vector3d vv = p4 - p3;
  39.                         Vector3d vu = p5 - p3;
  40.                         Plane plan = new Plane(p3, vv.CrossProduct(vu));
  41.                         if (ln.IsParallelTo(plan))
  42.                             return null;
  43.                         else
  44.                         {
  45.                             Point3d[] pnt = ln.IntersectWith(plan);
  46.                             if (pnt != null)
  47.                             {
  48.                                 return pnt[0];
  49.                             }
  50.                             else
  51.                             {
  52.                                 return null;
  53.                             }
  54.                         }
  55.                         tr.Commit();
  56.                     }
  57.                     catch (Exception)
  58.                     {
  59.                         throw;
  60.                     }
  61.                     
  62.                 }
  63.             }
  64.             else
  65.             {
  66.                 return null;
  67.             }
  68.         }
  69.     }
  70. }

相同功能的 XdGe 函数实现如下
  1. (defun linetoPlane (p1 p2 p3 p4 p5 / line3d plane pnt)
  2.   (and (setq line3d (xdge::constructor "kLine3d" p1 p2))
  3.        (setq plane (xdge::constructor "kPlane" p3 p4 p5))
  4.        (setq pnt (xdge::getpropertyvalue line3d "intersectWith" plane))
  5.        (xdge::free)
  6.   )
  7.   pnt
  8. )

测试代码,修改下点样式,不然可能不容易发现
  1. (defun c:tt (/ p1 p2 p3 p4 p5 p)
  2.   (if (and (setq p1 (getpoint "\n线上地一点: "))
  3.            (setq p2 (getpoint p1 "\n线上第二点: "))
  4.            (setq p3 (getpoint "\n平面上第一点: "))
  5.            (setq p4 (getpoint p3 "\n平面上第二点: "))
  6.            (setq p5 (getpoint p3 "\n平面上第三点: "))
  7.            (setq p (linetoplane p1 p2 p3 p4 p5))
  8.       )
  9.     (entmake (list '(0 . "point") (cons 10 p)))
  10.   )
  11.   (princ)
  12. )



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-9-23 22:16:58 来自手机 | 显示全部楼层
平面三点的合法性应判断
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-10-11 10:39:00 | 显示全部楼层
还可以利用 Calc 计算器计算

命令: (setq p1 (getpoint))
(3546.4 79.8683 823.661)

命令: (setq p2 (getpoint))
(4140.34 561.425 0.0)

命令: (setq p3 (getpoint))
(3546.4 561.425 0.0)

命令: (setq p4 (getpoint))
(4140.34 79.8683 0.0)

命令: (setq p5 (getpoint))
(4140.34 561.425 411.831)

命令: cal
>> 表达式: ilp(p1,p2,p3,p4,p5)
3991.85795,441.035465,205.915305

命令: (c:cal "ilp(p1,p2,p3,p4,p5)")
(3991.86 441.035 205.915)

ill 和 ilp 函数可以确定交点

ill(p1,p2,p3,p4)确定两条直线 (p1、p2) 和 (p3、p4) 的交点。所有点都被认为是三维点。

ilp(p1,p2,p3,p4,p5)确定直线(通过 p1、p2)和平面(通过三点 p3、p4、p5)的交点。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-19 00:21 , Processed in 0.382953 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表