CAD画图时用TR一次只能剪切一条线.用啥快捷键框选的方式一次剪掉多条线?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAD画图时用TR一次只能剪切一条线.用啥快捷键框选的方式一次剪掉多条线?相关的知识,希望对你有一定的参考价值。

austin_tom 这位朋友能不能把那个视频清晰点的发给我,或是讲解一下过程我可以再给你加分,邮箱342207009@qq.com

你使用的什么CAD版本呢?CAD2006以前是只能一次修剪一条线,如果要修剪多条的话就要使用F,如果你用这个方法不行那可能是软件有问题。从CAD2006开始修剪线条的时候可以进行框选,这个功能很好用。个人建议可以试试CAD2008版本,比较稳定,功能比较齐全。现在我在使用2011版,可能破解有问题,有些功能使用的时候有问题。 参考技术A

看看不是这样吗?

本回答被提问者采纳
参考技术B 框选所有要修剪的线,然后右键,之后直接修剪就行了,这样就可以剪掉多条线了 参考技术C TR 空格 空格 (2个空格),再选要剪的线,

给定一个边界框和一条线(两个点),确定该线是不是与该框相交

【中文标题】给定一个边界框和一条线(两个点),确定该线是不是与该框相交【英文标题】:Given a bounding box and a line (two points), determine if the line intersects the box给定一个边界框和一条线(两个点),确定该线是否与该框相交 【发布时间】:2010-07-13 08:29:03 【问题描述】:

给定一个边界框,定义为bounds.min.(x/y/z)bounds.max.(x/y/z),以及 3D 空间中的两个点(表示为 Vector3 对象),我如何确定这两个点所形成的线是否与边界框相交?

【问题讨论】:

【参考方案1】:

这里有一个 C++ 实现:Line Box Intersection (http://www.3dkingdoms.com/weekly/weekly.php?a=3)

另一个链接,包含大量交叉测试的参考(和代码):http://www.realtimerendering.com/intersections.html

如果你想了解更多关于交叉测试的知识,这本是圣经:Real-Time Collision Detection (Amazon)

编辑:paper 中的算法(“一种高效且稳健的 Ray-Box 相交算法”,Amy Williams 和 Steve Barrus 以及 R. Keith Morley 和 Peter Shirley;图形、gpu 和游戏工具杂志,Vol . 10(1), 49-54, 2005) 看起来特别简洁,而且还附带(C++)源代码。

【讨论】:

在将第一个链接中的代码转换为非丑陋的 C++ 之后,它似乎大部分都在工作。我会在这里为需要它的其他人发布代码,这样他们也不必转换它。【参考方案2】:

如果您想自己进行数学运算,这里有一种方法:将线与边界框创建的 6 个平面中的每一个相交。

线的向量表示为 X = B + t*D,其中 B 是基点的元组 (x,y,z)(例如,您的第一个点),D 是线的方向,再次表示为元组 (dx, dy, dz)。您通过从另一个点中减去一个点来获得方向,因此如果您有点 P1 (x1, y1, z1) 和 P2(x2, y2, z2),则 D = P2 - P1 和 B = P1,即 D = (x2 - x1, y2 - y1, z2 - z1)。我们将把这个向量的元素称为 dx、dy 和 dz。

平面的参数表示为x + y + z = c。因此,将您的边界框转换为此表示,然后使用您的线的参数表示,例如三个方程 x = x1 + tdx, y = y1 + tdy, z = z1 + t*dz, 在你的平面方程中替换 x,y 和 z。求解 t。由于您的 6 个平面中的每一个都将平行于由 2 个轴创建的平面,因此您的问题变得更容易;例如,对于与 x 和 y 轴创建的平面平行的平面,您的平面方程简单地变为 z = c,而 c 是您的边界框点之一的 z 坐标,依此类推。

现在使用 t 计算直线与平面的交点。 (如果 t 1,那么您的线与 P1-P2 的外部相交,如果 t >= 0 且 t

现在你还没有完成。平面方程给你一个平面,而不是一个矩形,所以与平面的交点实际上可能在你的矩形之外,但是因为你现在有了你的交叉点的坐标(x = x1 + t * dx 等等),您可以轻松查看该点是否在您的边界框的矩形内。您的问题现在简化为检查 2D 空间中的点是否在边界框矩形内,这很容易检查。

当然,如果您实际使用此解决方案,您应该做的第一件事是检查该线是否也沿一个轴对齐,因为在这种情况下,您的交点代码变得微不足道,它也会解决线不与某些平面相交,例如大量或少量的 t,甚至可能溢出或下溢。

我敢打赌有更快的方法来做到这一点,但它会奏效。

【讨论】:

如果有更快的方法,我需要了解它们,因为这段代码将在任何地方运行高达每秒 100 次,而且我添加的每次计算都会减慢游戏速度。跨度> 嗯,实际上我认为您发布的算法比我建议的要慢,因为它似乎适用于向量,例如对 GetIntersection 的每次调用都进行大量加法和四次乘法运算,因为它没有优化边界框与坐标系对齐的事实,这意味着您可以为每个平面交点抛出三个参数方程中的两个。我认为您可以在每个交叉点进行一次乘法运算。 糟糕,不,抱歉。丢弃那个。您需要三个乘法来计算命中的坐标。该死。【参考方案3】:

这是似乎可以工作的代码,从 Greg S 的答案转换为 C#:

bool CheckLineBox(Vector3 B1, Vector3 B2, Vector3 L1, Vector3 L2, ref Vector3 Hit)

    if (L2.x < B1.x && L1.x < B1.x) return false;
    if (L2.x > B2.x && L1.x > B2.x) return false;
    if (L2.y < B1.y && L1.y < B1.y) return false;
    if (L2.y > B2.y && L1.y > B2.y) return false;
    if (L2.z < B1.z && L1.z < B1.z) return false;
    if (L2.z > B2.z && L1.z > B2.z) return false;
    if (L1.x > B1.x && L1.x < B2.x &&
        L1.y > B1.y && L1.y < B2.y &&
        L1.z > B1.z && L1.z < B2.z)
    
        Hit = L1;
        return true;
    
    if ((GetIntersection(L1.x - B1.x, L2.x - B1.x, L1, L2, ref Hit) && InBox(Hit, B1, B2, 1))
      || (GetIntersection(L1.y - B1.y, L2.y - B1.y, L1, L2, ref Hit) && InBox(Hit, B1, B2, 2))
      || (GetIntersection(L1.z - B1.z, L2.z - B1.z, L1, L2, ref Hit) && InBox(Hit, B1, B2, 3))
      || (GetIntersection(L1.x - B2.x, L2.x - B2.x, L1, L2, ref Hit) && InBox(Hit, B1, B2, 1))
      || (GetIntersection(L1.y - B2.y, L2.y - B2.y, L1, L2, ref Hit) && InBox(Hit, B1, B2, 2))
      || (GetIntersection(L1.z - B2.z, L2.z - B2.z, L1, L2, ref Hit) && InBox(Hit, B1, B2, 3)))
        return true;

    return false;


bool GetIntersection(float fDst1, float fDst2, Vector3 P1, Vector3 P2, ref Vector3 Hit)

    if ((fDst1 * fDst2) >= 0.0f) return false;
    if (fDst1 == fDst2) return false;
    Hit = P1 + (P2 - P1) * (-fDst1 / (fDst2 - fDst1));
    return true;


bool InBox(Vector3 Hit, Vector3 B1, Vector3 B2, int Axis)

    if (Axis == 1 && Hit.z > B1.z && Hit.z < B2.z && Hit.y > B1.y && Hit.y < B2.y) return true;
    if (Axis == 2 && Hit.z > B1.z && Hit.z < B2.z && Hit.x > B1.x && Hit.x < B2.x) return true;
    if (Axis == 3 && Hit.x > B1.x && Hit.x < B2.x && Hit.y > B1.y && Hit.y < B2.y) return true;
    return false;

【讨论】:

【参考方案4】:

JavaScript 版本,基于 SpikeX 答案和 glMatrix:

// all args are Vec3, Hit will be filled by this algo
function checkLineBox( B1, B2, L1, L2, Hit)

    if (L2[0] < B1[0] && L1[0] < B1[0]) return false;
    if (L2[0] > B2[0] && L1[0] > B2[0]) return false;
    if (L2[1] < B1[1] && L1[1] < B1[1]) return false;
    if (L2[1] > B2[1] && L1[1] > B2[1]) return false;
    if (L2[2] < B1[2] && L1[2] < B1[2]) return false;
    if (L2[2] > B2[2] && L1[2] > B2[2]) return false;
    if (L1[0] > B1[0] && L1[0] < B2[0] &&
        L1[1] > B1[1] && L1[1] < B2[1] &&
        L1[2] > B1[2] && L1[2] < B2[2])
    
        vec3.set( L1, Hit);
        return true;
    

    if ((getIntersection(L1[0] - B1[0], L2[0] - B1[0], L1, L2, Hit) && inBox(Hit, B1, B2, 1))
      || (getIntersection(L1[1] - B1[1], L2[1] - B1[1], L1, L2, Hit) && inBox(Hit, B1, B2, 2))
      || (getIntersection(L1[2] - B1[2], L2[2] - B1[2], L1, L2, Hit) && inBox(Hit, B1, B2, 3))
      || (getIntersection(L1[0] - B2[0], L2[0] - B2[0], L1, L2, Hit) && inBox(Hit, B1, B2, 1))
      || (getIntersection(L1[1] - B2[1], L2[1] - B2[1], L1, L2, Hit) && inBox(Hit, B1, B2, 2))
      || (getIntersection(L1[2] - B2[2], L2[2] - B2[2], L1, L2, Hit) && inBox(Hit, B1, B2, 3)))
        return true;

    return false;


var temp = vec3.create();
function getIntersection( fDst1, fDst2, P1, P2, Hit)

    if ((fDst1 * fDst2) >= 0) return false;
    if (fDst1 == fDst2) return false;

    vec3.subtract(P2, P1, temp);
    vec3.scale( temp, (-fDst1 / (fDst2 - fDst1)));
    vec3.add( temp, P1, Hit);

    return true;


function inBox(Hit, B1, B2, Axis)

    if (Axis == 1 && Hit[2] > B1[2] && Hit[2] < B2[2] && Hit[1] > B1[1] && Hit[1] < B2[1]) return true;
    if (Axis == 2 && Hit[2] > B1[2] && Hit[2] < B2[2] && Hit[0] > B1[0] && Hit[0] < B2[0]) return true;
    if (Axis == 3 && Hit[0] > B1[0] && Hit[0] < B2[0] && Hit[1] > B1[1] && Hit[1] < B2[1]) return true;
    return false;

【讨论】:

【参考方案5】:

您可以将边界框表示为 12 个三角形(6 个面各 2 个)。然后你可以检查你的线与他们每个人的交点。我有一个线三角形相交函数,但它是为我自己的软件渲染引擎编写的,而不是为 D3D 编写的。如果您需要代码,我可以尝试转换它。

【讨论】:

我可以做到这一点,但我不知道它的性能如何......这会运行每个“更新”,每秒运行很多次,我不确定它会怎么样,但它当然值得一试。如果您发布线/三角形交点的代码,我可以让它工作(而且速度不慢),我会把它给你。

以上是关于CAD画图时用TR一次只能剪切一条线.用啥快捷键框选的方式一次剪掉多条线?的主要内容,如果未能解决你的问题,请参考以下文章

cad三维制图中如何找到一条线与一个面的交点,如空间斜线与水平标高24M面的交点,如何找到该交点

CAD中修剪的快捷键是啥?

cad中修剪的快捷键是啥

CAD2012怎么用多线命令沿一条中线画对称的两条线

我如何画一条线,然后在 three.js 中从它创建一个剪切平面?里面的工作示例

在cad中怎样画平行线?