Java+AutoCAD-给无关的直线建立关联

如下图所示,有些直线和直线在视觉上看是关联的,我们也给每条直线建立了节点。但是下图中的横向的直线,左侧有一个节点,但是这个节点同纵向的直线没有关系,也就是说横向的直线在逻辑上是独立的。

 

 

要建立横向直线和纵向直线的关联关系,考虑的一个解决方案是将纵向的直线拆成两条,下半部的终点是横向直线的左侧节点,上半部的起点是横向直线的左侧节点,在逻辑关系上相当于一个三通。

在程序处理上,循环判断每个节点,如果节点同直线的距离小于某个值,则认为节点是在直线上的,可以拆分直线。这里之所以要判断距离小于某个值,是因为在视觉上看,节点在直线上,实际在数据级别上,他们之间还是有一定的距离的。

    public double NODE_DISTINCE_MIN = 500;//节点拆分直线,节点到直线的最小距离

     public int splitLine(Yxxf D){

          int iCount = 0;//拆分的数量

         //遍历所有图元

           YxxfEntBlock blk = D.secEntities.insMSpace.block;

           YxxfEnt ent = null;

           int nextToDraw = 0;

        while (true)

        {

            ent = (YxxfEnt)blk.nextEntity(nextToDraw);

 

            if (ent == null)

                break;

           

            if(ent.getClass()==YxxfEntLine.class){

                   YxxfEntLine entLine = (YxxfEntLine)ent;

                  

                   //该节点是直线的起点,不处理

                   if(entLine.begObj.getClass() == YxxfEntNode.class){

                          YxxfEntNode nodeObj = (YxxfEntNode)entLine.begObj;

                          if(nodeObj.id.equals(id)){

                                 nextToDraw++;

                              continue;

                          }

                   }

                  

                   //该节点是直线的终点,不处理

                   if(entLine.endObj.getClass() == YxxfEntNode.class){

                          YxxfEntNode nodeObj = (YxxfEntNode)entLine.endObj;

                          if(nodeObj.id.equals(id)){

                                 nextToDraw++;

                              continue;

                          }

                   }

                  

                   //计算点到直线的距离

                   double distance = PointToSegDist(x,y,entLine.begpnt.x,entLine.begpnt.y,entLine.endpnt.x,entLine.endpnt.y);

                   if(distance<</span>D.NODE_DISTINCE_MIN){//点在直线上

                          //计算新直线的长度

                          int length = 0;//总长度

                          int newLength = 0;//本点到终点的长度

                          try{

                                 length = new Integer(entLine.pipeLength).intValue();

                                 double tmp1 = Math.sqrt(Math.pow(entLine.endpnt.x-x, 2)+Math.pow(entLine.endpnt.y-y, 2));//本点到直线终点的长度

                                 double tmpAll = Math.sqrt(Math.pow(entLine.endpnt.x-entLine.begpnt.x, 2)+Math.pow(entLine.endpnt.y-entLine.begpnt.y, 2));//直线总长度

                                 if(tmpAll!=0)

                                        newLength = new Double(length * tmp1 / tmpAll).intValue();

                          }catch(Exception e){

                                

                          }

                          //新的直线

                          YxxfEntLine new_line = new YxxfEntLine();

                          new_line.id = D.getEntId();//赋值id

                          new_line.begpnt.x = x;

                          new_line.begpnt.y = y;

                          new_line.begpnt.z = 0;

                          new_line.endpnt.x = entLine.endpnt.x;

                          new_line.endpnt.y = entLine.endpnt.y;

                          new_line.endpnt.z = entLine.endpnt.z;

                          new_line.thickness = entLine.thickness;

                          new_line.xtruDir.x = entLine.xtruDir.x;

                          new_line.xtruDir.y = entLine.xtruDir.y;

                          new_line.xtruDir.z = entLine.xtruDir.z;

                          new_line.begObj = this;

                          new_line.endObj = entLine.endObj;

                          new_line.diameter = entLine.diameter;

                          new_line.pipeLength = String.valueOf(newLength);

                          //计算java坐标

                          new_line.begPoint.x = D.calcPointX(entLine.begpnt.x);

                          new_line.begPoint.y = D.calcPointY(entLine.begpnt.y);

                          new_line.endPoint.x = entLine.endPoint.x;

                          new_line.endPoint.y = entLine.endPoint.y;

                          blk.addEntity(new_line);

                         

                          //原来的直线

                          entLine.endpnt.x = x;

                          entLine.endpnt.y = y;

                          entLine.endpnt.z = 0;

                          entLine.endObj = this;

                          entLine.pipeLength = String.valueOf(length-newLength);

                          entLine.endPoint.x = D.calcPointX(entLine.endpnt.x);

                          entLine.endPoint.y = D.calcPointY(entLine.endpnt.y);

                          iCount++;

                   }

         }

            nextToDraw++;

        }

      return iCount;

       }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值