找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1278|回复: 16

[求助] 怎么通过其标注找到其对应的实体呢?

[复制链接]
发表于 2017-8-7 10:40:10 | 显示全部楼层 |阅读模式

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

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

×
比如 我要找一条红色竖直线但不是唯一的,但是其傍边标注0.00时唯一的,那怎么通过0.00标注找到其对应的实体呢?
我采用的方法是  先获取相应数据库
再通过块表记录找到0.00实体的位置
找离0.00最近的红色多线段
从而找到傍边的红色竖线

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

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-7 10:48:15 | 显示全部楼层
本帖最后由 newer 于 2017-8-7 10:55 编辑

1、你生成标注的时候,就把标注和你需要的线联系起来,比如组等等
2、如果1没有做,你只能用“笨”方法。

ACAD以后个选择集的东西,

用acedSSGet 构建 文字框适当扩大(根据你的精度)的选择集,如果有选择集,你判断下是否有你需要的直线。
构建这个选择集实体需要显示在屏幕内。

这个也很快的,选择集可以根据需要“过滤”,比如红色什么的,构建很快。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-7 11:04:30 | 显示全部楼层

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-7 11:30:43 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2017-8-7 11:50:12 | 显示全部楼层

大神 你的意思是 用户在绘图的时候 多次选择图形码?这样绘图人员 估计会不好操作
我的想法是 先遍历从库中把需要的相关实体保存并联系起来
然后 绘图人员在选择实体集时 只需选择他要的实体
至于和他选择实体相关的实体和数据 估计设计人员不理解内部数据的关联性
在编程时 我就先把这些内部数据先关联起来 设计人员只需要选择他要的图形时
就能把内部数据关联起来了 完成相关功能
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-7 12:26:48 | 显示全部楼层

构建选择集也不一定让用户交互啊,你程序做啊,不管你标注是怎么找到的,找到标注后,你生成标注的外围包围盒,然后用 SSGET 的CP 加点表,构建选择集,这不用用户交互的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-7 12:30:31 | 显示全部楼层
比如 我要找一条红色竖直线但不是唯一的,但是其傍边标注0.00时唯一的,那怎么通过0.00标注找到其对应的实体呢?

这个是你的问题。

有两个解决方法:

1、如果这些东西,都是你的程序画的,那么你在画他们的时候就建立起联系,一个方法是把红色的直线和标注建成组。以后通过组就能找到直线。

2、如果你不做1, 找到标注后, 这个标注你得到外框点表,然后通过这个点表构建他附近的红色直线选择集(这个选择集是临时的,只是为了找到你需要的红色的线,用完释放,不影响你以后还用选择集做其他事情)
    如果选到了,你从选择集找到红色的直线,做你下面的工作。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-7 13:14:38 | 显示全部楼层

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-7 13:44:51 | 显示全部楼层

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-8-7 15:00:53 来自手机 | 显示全部楼层
这样开发不是一般的累

点评

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

使用道具 举报

 楼主| 发表于 2017-8-7 20:20:22 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2017-8-7 20:22:15 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2017-9-14 08:53:11 | 显示全部楼层

这是可以运行的代码 和原先的需求有些变化  谢谢大神的指导
acutPrintf(_T("Hello!"));
  int i,j,k,n,m;
  Acad::ErrorStatus es;
  //地面线
  std::vector<cgp> dmp;
  std::vector<int> dmspi;
  std::vector<int> dmepi;
  std::vector<std::vector<cgp> > dmpp;
  //三角点
  //std::vector<cgp> trip;
  //std::vector<std::vector<cgp> > trips;
  //中桩点
  //std::vector<cgp> csbasep;
  //std::vector<std::vector<cgp> > csbaseps;
  //冠号名
  std::vector<CString> headerStr;
  //std::vector<std::vector<CString> > headStrs;
  //里程值
  std::vector<CString> mileStr;
  //起点水平标高
  std::vector<CString> hsgStr;
  //Hsg点的位置
  std::vector<cgp> hsgP;
  //寻找中桩点的参考位置x
  //std::vector<double> basePx;
  std::vector<double> numPx;//这是存储数字标注位置点的x轴值
  std::vector<CString> numLab;//截面红色数字标注 只有数字的标注
  std::vector<cgp> numP;//这是存储数字标注的点
  std::vector<double> zeroPx;//这是保存0.00的x坐标值 因为hsg不是唯一的
  std::vector<cgp> zeroP;//保存零点
  std::vector<cgp> baseHsgP;//这是保存基线的hsg的点
  //地质标注
  std::vector<CString> dzLabStr;
  //地质标注点位置
  std::vector<cgp> dzlabp;
  //地质线
  std::vector<cgp> dzp;
  //地质钻孔
  std::vector<cgp> dzdrillp;
  //地质专业文字标注
  std::vector<CString> dzWZLab;
  //地质专业文字标注点
  std::vector<cgp> dzWZLabp;
  //所有的绿色标注
  std::vector<CString> allGreenLab;
  std::vector<cgp> allGreenLabp;
  //三位小数的点和标注
  std::vector<cgp> Decimal3NumP;
  std::vector<CString> Decimal3NumLab;
  ads_name ssml;
  ads_name ent;
  AcDbObjectId objId;
  AcDbEntity *pEnt;
  //这表示曾经有选择集  就直接获取个数
  long l=0;
  acedSSGet(_T("_I"),NULL,NULL,NULL,ssml);
  acedSSLength(ssml,&l);
  if(l==0)
  {
   acedSSFree(ssml);
   if(acedSSGet(NULL,NULL,NULL,NULL,ssml)!=RTNORM)
    return;
   acedSSLength(ssml,&l);
  }
  
  double dis=0.1;
  double dis1=0.15;
  
  for(i=0;i<l;i++)
  {
   acedSSName(ssml,i,ent);
   acdbGetObjectId(objId,ent);
   pEnt=NULL;
   es=acdbOpenAcDbEntity(pEnt,objId,AcDb::kForRead);
   if(pEnt!=NULL)
   {
    if(pEnt->isKindOf(AcDbPolyline::desc()))
    {
     try
     {
      AcDbPolyline *papl;
      papl=(AcDbPolyline *)pEnt;
      double tplcw=0,trvv=0;
      papl->getConstantWidth(tplcw);
      int ci;
      ci=papl->colorIndex();
      //256bylayer,0byblock
      if(ci==256)
      {
       CString ttln;
       ttln=papl->layer();
       ci=GetLayerColor(ttln);//获取图层颜色
      }
      if(ci==0)
      {
       ci=7;      
      }
      //判断是否地面线 绿色-地面线 这是习惯
      if(tplcw>0 && tplcw<0.07 && ci==3)
      {
       if(papl->numVerts()>1)
       {
        int fi;
        int dzfi;
        int ttn=0;
        AcGePoint2d lastp;
        for(j=0;j<papl->numVerts();j++)
        {
         ttn++;
         AcGePoint2d p1;
         papl->getPointAt(j,p1);
         cgp tppp;
         tppp.x=p1.x;
         tppp.y=p1.y;
         //装入地面线点
         //dmp.push_back(tppp);
         if(j!=0)
         {
          double llv;
          llv=sqrt((p1.x-lastp.x)*(p1.x-lastp.x)+(p1.y-lastp.y)*(p1.y-lastp.y));
          if(llv>dis)//dis=0.1
          {
           dmp.push_back(tppp);
           lastp=p1;
          }
         }
         else
         {
          dmp.push_back(tppp);
          fi=dmp.size()-1;
          lastp=p1;
         }
        }
       }
      }
      //地质线
      else if((tplcw<cgzero)&&(ci==13))
      {
       if(papl->numVerts()>1)
       {
        int fi;
        int dzfi;
        int ttn=0;
        AcGePoint2d lastp;
        for(j=0;j<papl->numVerts();j++)
        {
         ttn++;
         AcGePoint2d p1;
         papl->getPointAt(j,p1);
         cgp tppp;
         tppp.x=p1.x;
         tppp.y=p1.y;
         //装入地质线点
         //dzp.push_back(tppp);
         if(j!=0)
         {
          double llv;
          llv=sqrt((p1.x-lastp.x)*(p1.x-lastp.x)+(p1.y-lastp.y)*(p1.y-lastp.y));
          if(llv>dis)
          {
           dzp.push_back(tppp);
           lastp=p1;
          }
         }
         else
         {
          dzp.push_back(tppp);
          fi=dmp.size()-1;
          lastp=p1;
         }
        }
       }
      }
      else if((tplcw<cgzero)&&(ci==31))//地质钻孔
      {
       if(papl->numVerts()>1)
       {
        int fi;
        int dzfi;
        int ttn=0;
        AcGePoint2d lastp;
        for(j=0;j<papl->numVerts();j++)
        {
         ttn++;
         AcGePoint2d p1;
         papl->getPointAt(j,p1);
         cgp tppp;
         tppp.x=p1.x;
         tppp.y=p1.y;
         //装入地质线点
         dzdrillp.push_back(tppp);
         if(j!=0)
         {
          double llv;
          llv=sqrt((p1.x-lastp.x)*(p1.x-lastp.x)+(p1.y-lastp.y)*(p1.y-lastp.y));
          if(llv>dis)
          {
           dzp.push_back(tppp);
           lastp=p1;
          }
         }
         else
         {
          dzp.push_back(tppp);
          fi=dmp.size()-1;
          lastp=p1;
         }
        }
       }
      }
     }
     catch(...)
     {
     }
    }
    //某些图里面地面线和地质线炸开了
    //if(pEnt->isKindOf(AcDbLine::desc()))
    //{
    // try
    // {
    //  AcDbLine *papl;
    //  papl=(AcDbLine *)pEnt;
    //  int ci;
    //  ci=papl->colorIndex();//
    //  //地质线
    //  if(ci==13)
    //  {
    //   
    //  }
    // }
    // catch(...)
    // {
    //  
    // }
    //}
    //现在思路是这样:获取hsg起点水平标高后,记录其在此设计图中x的坐标位置
    //然后再保存所有只有 红色数字 的标注及其点的x位置,同时也保存了地面线的点
    // 等以l为for的条件循环结束后,
    //再把这些保存起来的数字标注与地面线做比较 也与hsg的x位置做比较
    //如果在地面线小域内且也在x值小范围内 那么就是中桩点的标注 域就是指地面线附近
    //相当于中桩点标注满足了两个要求:即在地面线附近又在hsg起点水平标注的x附近
    if(pEnt->isKindOf(AcDbText::desc()))
    {
     AcDbText *pTxt;
     pTxt=(AcDbText *)pEnt;
     int ci=0;
     ci=pTxt->colorIndex();     
     CString hsgNum;//水平起点标高
     CString lpNum;//颜色为1和7的点的水平标高值
     if(ci==1||ci==7 || ci==0) //1代表红色 7代表白色
     {
      AcGePoint3d baseAgp3d=pTxt->position();
      cgp tp;
      //copyagptocp1(baseAgp3d,tp);
      tp.x=baseAgp3d.x;
      tp.y=baseAgp3d.y;
      tp.z=baseAgp3d.z;
      ACHAR *pch=pTxt->textString();
      CString txtStr(pch);
      txtStr.Trim();//这有问题 把0.04与0.00区分不出来
      int strLen=txtStr.GetLength();
      //if(*pch==_T('0.00'))
      //{
      // strLen=strLen-1;
      //}
      bool isNum=false;
      bool isHsg=false;
      int dn=0;//点后面的尾数 中桩点的后面 是三位小数
      int dotFlag=0;      
      for(j=0;j<strLen;j++)
      {
       if(txtStr.GetAt(j)=='H'&&txtStr.GetAt(j+1)=='s'&&txtStr.GetAt(j+2)=='g')
       {
        //找的是基线hsg后面的数字
        for(k=j+3;k<strLen;k++)
        {
         hsgNum=hsgNum+txtStr.GetAt(k);
        }
        isHsg=true;
        break;//跳出本次j循环 寻找下一个循环
       }
       else
       {
        isHsg=false;
       }
       //表示只含数字      
       if(txtStr.GetAt(j)=='0' || txtStr.GetAt(j)=='1' || txtStr.GetAt(j)=='2'||
         txtStr.GetAt(j)=='3' || txtStr.GetAt(j)=='4' || txtStr.GetAt(j)=='5'||
         txtStr.GetAt(j)=='6' || txtStr.GetAt(j)=='7' || txtStr.GetAt(j)=='8'||
         txtStr.GetAt(j)=='9' || txtStr.GetAt(j)=='.' )//表示只含数字
       {
        //
        isNum=true;
        lpNum=lpNum+txtStr.GetAt(j);
        //发现小数点后 就把小数点标志设为1
        if(txtStr.GetAt(j)=='.')
        {
         dotFlag=1;
        }
        //当发现小数点后 就开始记录 保存dn==4的点(带点一起算的 所以是4)
        if(dotFlag==1)
        {
         dn++;
        }
       }
       else
       {
        //isHsg=false;
        isNum=false;
        break;
       }
      }
      if(isNum)
      {
       ////保存所有 颜色为1和7的点的水平标高的标注点
       //numP.push_back(tp);
       ////保存所有 。。。。。。数字标注点的x位置
       //double numx=baseAgp3d.x;
       //numPx.push_back(numx);
       ////保存所有 。。。。。。数字值
       //numLab.push_back(lpNum);
       ////在这里遇到一个问题 txtStr.GetLength()返回的是5而不是4
       ////用trim()解决
       ////zeroPx.push_back(numx);
       ////这里换思路 通过0.00找到红色竖直线 而不能直接用0.00的坐标点
       ////因为。。。
       ////if(*pch==_T('0.00'))
       ////{
       //// zeroPx.push_back(numx);//这有问题 把0.04与0.00区分不出来
       ////}
       //这里要改成f比较 是因为字符串不能进行比较 因为是会把0.04变为0.0 就无法和0.00区分开来了
       double f=_wtof(txtStr);
       if(f<cgzero)
       {
        //zeroPx.push_back(numx);//不能只存x值 因为上下两个图 x值相同要依靠y值来区分改为存入点
        zeroP.push_back(tp);//保存0.00的点
       }
       else
       {
        //不能保存所有 因为要把zeroP的点和其它点分开做比较 如果存在一起 会把0.00的点也存入 颜色为1和7的点的水平标高的标注点
        numP.push_back(tp);
        //保存所有 。。。。。。数字标注点的x位置
        double numx=baseAgp3d.x;
        numPx.push_back(numx);
        //保存所有 。。。。。。数字值
        numLab.push_back(lpNum);
        //dn 表示的是小数后面跟了三位数 ==4 是因为上面从点开始计算的 所以dn==4
        if(dn==4)
        {
         Decimal3NumP.push_back(tp);
         Decimal3NumLab.push_back(lpNum);
        }
       }
      }
      if(isHsg)
      {
       //保存基线hsg的标注
       hsgStr.push_back(hsgNum);
       //保存基线hsg点的位置
       hsgP.push_back(tp);
      }
     }
     if(ci==3||ci==1||ci==0) //3代表绿色 1代表红色 0代表白色  找里程标注 也找既有新信息
     {
      ACHAR *pch=pTxt->textString();
      CString txtStr(pch);
      txtStr=pTxt->textString();
      //保存所有绿色文字标注信息及其点
      allGreenLab.push_back(txtStr);
      AcGePoint3d agp=pTxt->position();
      cgp tp;
      tp.x=agp.x;
      tp.y=agp.y;
      tp.z=agp.z;
      allGreenLabp.push_back(tp);
      //或者里程冠号名
      int kPos;
      kPos=txtStr.Find(_T('K'));
      CString strHeader;
      if(kPos>=0)
      {
       for(j=0;j<kPos+1;j++)
       {
        strHeader=strHeader+txtStr.GetAt(j);//获取冠桩名
       }
       headerStr.push_back(strHeader);
      }
      //或者里程冠号值
      int rkPos;//如果k在第一个那么find返回的值就是0
      rkPos=txtStr.ReverseFind(_T('K'));
      CString strNum;
      if(rkPos>=0)
      {
       for(j=rkPos+1;j<txtStr.GetLength()-1;j++)
       {
        //0x46 == "."
        if( (txtStr.GetAt(j)>0x2F)||(txtStr.GetAt(j)<0x3A)||(txtStr.GetAt(j)==0x46))
        {
         strNum=strNum+txtStr.GetAt(j);
        }
       }
       //这是获取里程值
       mileStr.push_back(strNum);
      }
     }
     else if(ci==13)
     {
      ACHAR *pch=pTxt->textString();
      CString txtStr(pch);
      dzLabStr.push_back(txtStr);//地质标注
      AcGePoint3d dzAgp3d=pTxt->position();
      cgp dzcp;
      dzcp.x=dzAgp3d.x;
      dzcp.y=dzAgp3d.y;
      dzcp.z=dzAgp3d.z;
      dzlabp.push_back(dzcp);//地质标注点
     }
     else if(ci=31)//地质文字
     {
      ACHAR *pch=pTxt->textString();
      CString txtStr(pch);
      int isD=txtStr.Find(_T('D'));
      int isZ=txtStr.Find(_T('Z'));
      if(isD>0&&isZ>0)
      {
       dzWZLab.push_back(txtStr);
       AcGePoint3d dzWZLabAgp3d=pTxt->position();
       cgp dzWZcp;
       dzWZcp.x=dzWZLabAgp3d.x;
       dzWZcp.y=dzWZLabAgp3d.y;
       dzWZcp.z=dzWZLabAgp3d.z;
       dzWZLabp.push_back(dzWZcp);//地质文字标注点
      }
     }
    }
    pEnt->close();
   }
   //acedSSFree(ssml);
  }//for l 结束
  acedSSFree(ssml);//写上面只能得到选择集中的第一个
  //获取地面线附近文字标注
  std::vector<CString> dmWZLab;
  std::vector<cgp> dmWZLabp;
  for(i=0;i<allGreenLabp.size();i++)
  {
   cgp ttp=allGreenLabp.at(i);
   double ty=ttp.y;
   CString strWZ=allGreenLab.at(i);
   bool isfind=false;
   for(j=0;j<dmp.size()-1;j++)
   {
    cgp dp1=dmp.at(j);
    cgp dp2=dmp.at(j+1);
    //if(dp1.y<ty<dp2.y+1.0)
    if(ty>dp1.y && ty<dp2.y+1.0)
    {
     isfind=true;
     continue;
    }
   }
   if(isfind)
   {
    dmWZLabp.push_back(ttp);//这样就避免重复装入
    dmWZLab.push_back(strWZ);
   }  
  }
  //这是找既有线部分信息 刚博说了 不管这
  std::vector<CString> hjgLineName;
  std::vector<CString> hjgDis;
  //std::vector<CString> hjgInfo
  for(i=0;i<allGreenLab.size();i++)
  {
   CString strInfo;
   strInfo=allGreenLab.at(i);
   int LArc,RArc,dot;
   LArc=strInfo.Find(_T('('));
   RArc=strInfo.Find(_T(')'));
   if(LArc>=0&&RArc>0)
   {
    //再判断有没有小数点
    dot=strInfo.Find(_T('.'));
    if(dot>0)
    {
     //有小数点就是距离
     hjgDis.push_back(strInfo);
    }
    else
    {
     //没有小数点就是股道名
     hjgLineName.push_back(strInfo);
    }
   
   }
  }
  
  //这里主要是根据上面存储的所有数字标注点numP,地面线与hsg点的x位置 三个数组找到中桩点的水平标注
  //但是因为hsg在每个股道上都有 所以必须找到0.00的标注点x的值作为筛选
  //关键现在是 如果很多股道每个股道都有hsg 而又没有标出0.00 那怎么解决?那就是没有水平距离的就是基线了
  //地面数字点
  std::vector<cgp> dmNumP;
  //地面数字标注
  std::vector<CString> dmNumLab;
  //数字标注与地面线主要是y值上下的范围 取一个增量y 在这个范围内 就满足第一个条件 保存在dmNumP中
  //但是现在已经获取了0.00的点和x值 不如直接用0.00的作比较 这样循环不是更小吗?
  //不能完全这样 因为有些图没有标出0.00的值 那就只能用这种方式了 Decimal3NumP
  //for(i=0;i<numP.size();i++)//所有的点数字标注点 其实可以用0.00的标注点来筛选 这样循环就会变少
  //{
  // cgp ttp=numP.at(i);
  // double tx=ttp.x;
  // double ty=ttp.y;
  // bool isfind=false;
  // for(j=0;j<dmp.size()-1;j++) //地面线
  // {
  //  cgp dp1=dmp.at(j);
  //  cgp dp2=dmp.at(j+1);
  //  //if(dp1.y<ty<dp2.y+1.0)
  //  if(ty>dp1.y && ty<dp2.y+1.0)
  //  {
  //   //dmpNumP.push_back(ttp); //这里会重复加入 因为for不断地重复
  //   isfind=true;
  //   continue;
  //  }
  // }
  // if(isfind)
  // {
  //  dmNumP.push_back(ttp);//这样就可以把后面去重的代码去掉了
  //  dmNumLab.push_back(numLab.at(i));
  // }
  //}
  //所有的点数字标注点 其实可以用0.00的标注点来筛选 这样循环就会变少
  for(i=0;i<Decimal3NumP.size();i++) //因为这里是找中桩点 其都是三位小数 所以不在用所有的点 用尾数为三位的点
  {
   cgp ttp=Decimal3NumP.at(i);
   double tx=ttp.x;
   double ty=ttp.y;
   bool isfind=false;
   for(j=0;j<dmp.size()-1;j++) //地面线
   {
    cgp dp1=dmp.at(j);
    cgp dp2=dmp.at(j+1);
    //if(dp1.y<ty<dp2.y+1.0)
    if(ty>dp1.y && ty<dp2.y+1.0)
    {
     //dmpNumP.push_back(ttp); //这里会重复加入 因为for不断地重复
     isfind=true;
     continue;
    }
   }
   if(isfind)
   {
    dmNumP.push_back(ttp);//这样就可以把后面去重的代码去掉了
    dmNumLab.push_back(Decimal3NumLab.at(i));
   }
  }
  //这一部分是把dmpNumP重复的数据给去掉 保存在dnp中
  //std::vector<cgp> dnp;
  //cgp tp0=dmpNumP.at(0);
  //dnp.push_back(tp0);
  //for(i=0;i<dmpNumP.size()-1;i++)
  //{
  // cgp tp1=dmpNumP.at(i);
  // cgp tp2=dmpNumP.at(i+1);
  // if( (i+1)!=dmpNumP.size())
  // {
  //  if(tp1.y==tp2.y)
  //  {
  //   continue;
  //  }
  //  else
  //  {
  //   dnp.push_back(tp2);
  //  }
  // }
  //}
  //只有满足条件一的才接着比较 与hsg点的x位置范围内的 就满足条件二 然后保存对应的数字标注就是中桩标注了
  //这里放弃hsg 是因为每个股道上都有hsg 现在改为0.00的x位置范围   
  //改为0.00的x位置范围 还是要条件一 因为中桩标注在地面附近的才是中桩点 如果只对应 0.00的x位置范围
  //而不在地面线附近 那就不是中桩点了
  std::vector<CString> csbaseLab;//中桩点的标注
  std::vector<cgp> csbasep;//中桩点
  //表示绘图时 基线上标注了0.00
  if(zeroP.size()>0) //zeroPx表示标注0.00的点
  {
   for(i=0;i<dmNumP.size();i++)//dmNumP表示地面附近的数字标注点
   {
    //cgp dnhp=dnp.at(i);
    cgp dhp=dmNumP.at(i);
    double tdhx=dhp.x;
    bool isfind=false;
    for(j=0;j<zeroP.size();j++) //以前采用的hsg的x位置 现在采用的是0.00的x位置
    {
     double hx=zeroP.at(j).x;
     //if(hx-0.2<dnx<hx+0.2)
     if((tdhx>hx-0.5)&&(tdhx<hx+0.5))
     {
      //这就是获取中桩的水平标注  
      isfind=true;
      continue;     
     }
    }
    if(isfind)
    {
     csbaseLab.push_back(dmNumLab.at(i));//这样就不重复加入
     csbasep.push_back(dhp);
    }
   }
  }
  else //没有标注0.00的情况
  {
   
  }
  //for(i=0;i<dmNumP.size();i++)
  //{
  // //cgp dnhp=dnp.at(i);
  // cgp dhp=dmNumP.at(i);
  // double tdhx=dhp.x;
  // bool isfind=false;
  // for(j=0;j<numPx.size();j++)
  // {
  //  double hx=numPx.at(j);
  //  //if(hx-0.2<dnx<hx+0.2)
  //  if((tdhx>hx-0.05)&&(tdhx<hx+0.05))
  //  {
  //   //这就是获取中桩的水平标注  
  //   isfind=true;
  //   continue;     
  //  }
  // }
  // if(isfind)
  // {
  //  csbaseLab.push_back(numLab.at(i));//这样就不重复加入
  //  csbasep.push_back(dhp);
  // }
  //}
  //把csbaseLab的重复部分去掉
  //bool isErase=false;
  //std::vector<CString>::iterator locIter;
  ////std::vector<cgp>::iterator locIterp;
  //for(i=0;i<csbaseLab.size();i++)
  //{
  // CString str1=csbaseLab.at(i);
  // //locIterp=csbasep.begin()+1+i;
  // for(locIter=csbaseLab.begin()+1+i;locIter!=csbaseLab.end();locIter++)
  // {
  //  if(str1==*locIter)
  //  {
  //   csbaseLab.erase(locIter);
  //   //csbasep.erase(locIterp);//去重复的点 重复的顺序不一样
  //   isErase=true;
  //  }
  //  if(isErase)
  //  {
  //   //locIter=csbaseTLab.begin()+1+i;
  //   isErase=false;
  //   if(locIter==csbaseLab.end())
  //   {
  //    break;
  //   }
  //  }
  //  //locIterp++;
  // }
  // if(i+1==csbaseLab.size())
  // {
  //  break;
  // }
  //}
  //去重复的点 不用这个是因为有错 cgp tp=csbasep.at(i);类型对不上
  //bool isErasep=false;
  //std::vector<cgp>::iterator locIterp;
  //for(i=0;i<csbasep.size();i++)
  //{
  // cgp tp=csbasep.at(i);
  // //locIter=csbaseTLab.begin()+1;
  // for(locIterp=csbasep.begin()+1+i;locIterp!=csbasep.end();locIterp++)
  // {
  //  if(tp==*locIterp)
  //  {
  //   csbasep.erase(locIterp);
  //   isErasep=true;
  //  }
  //  if(isErase)
  //  {
  //   //locIter=csbaseTLab.begin()+1+i;
  //   isErasep=false;
  //   if(locIterp==csbasep.end())
  //   {
  //    break;
  //   }
  //  }
  // }
  // if(i+1==csbasep.size())
  // {
  //  break;
  // }
  //}
///////////////////////////////////////////////////////////////////////////////////////////
  CString nfn;
  CFileDialog filedlg(TRUE,_T("Sec Files(*.sec)"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("Sec Files (*sec)|*.sec||"),NULL);
  filedlg.DoModal();
  nfn=filedlg.GetPathName();
  if(nfn.IsEmpty()==false)
  {
   try
   {
    CStdioFile s;
    if(s.Open(nfn,CFile::modeCreate|CFile::modeReadWrite)==TRUE)
    {
     CString tstr;
     tstr="";
     s.WriteString(tstr);
     tstr="\n6.900 6.600 6.000 5.600";
     s.WriteString(tstr);
     tstr="\n12.000 8.000 2.000 0.080 21.000 12.000 2.000 0.080";
     s.WriteString(tstr);
     tstr="\n1.000";
     s.WriteString(tstr);
     cgp ttbp;
     //这里是选取了多少个截面循环就用中桩点来表示 多少个中桩点就多少个截面
     for(i=0;i<csbasep.size();i++)
     {
      double basePx=csbasep.at(i).x;
      double basePy=csbasep.at(i).y;
      CString gffn;
      int gffnv=1;
      if(dzLabStr.size()>0)
      {
       gffnv=dzLabStr.size();
       for(j=0;j<dzLabStr.size();j++)
       {
        if(j==0)
        {
         gffn=dzLabStr.at(j);
        }
        else
        {
         gffn=gffn+_T(" ")+dzLabStr.at(j);
        }
       }
      }
      else
      {
       gffn="<1>";
       gffnv=1;
      }
      //0表示断面开始行 第二个数据为里程值,第三个值为里程冠号 第四个值为本断面有多少个地质符号,第五个值开始就是具体的地质符号值。
      tstr.Format(_T("\n0 %s %s %d %s"),mileStr.at(i),headerStr.at(i),gffnv,gffn);
      s.WriteString(tstr);
      //第一个数据为1,表示为地面线或地质地层线 第二个数据为0为地面线 最后一个为地面线个数
      tstr.Format(_T("\n1 0 0.000 3 %d"),dmp.size());
      s.WriteString(tstr);
      for(j=0;j<dmp.size();j++)
      {
       tstr.Format(_T(" %.3f %.3f"),dmp.at(j).x-basePx,dmp.at(j).y-basePy);
       s.WriteString(tstr);
      }
      //地质线 第二个数据为1为地面线 最后一个为地质线个数
      tstr.Format(_T("\n1 1 0.000 13 %d"),dzp.size());
      s.WriteString(tstr);
      double jz=0;
      for(j=0;j<dzp.size();j++)
      {
       tstr.Format(_T(" %.3f %.3f"),dzp.at(j).x-basePx,dzp.at(j).y-basePy);
       s.WriteString(tstr);
      }     
      //地质标注
      for(j=0;j<dzlabp.size();j++)
      {
       tstr.Format(_T("\n2 %.3f %.3f 0 0 0 0 0 %s"),dzlabp.at(j).x,dzlabp.at(j).y,dzLabStr.at(j));
       s.WriteString(tstr);
      }  
      //地质符号
      for(j=0;j<dzlabp.size();j++)
      {
       tstr.Format(_T("\n5 %.3f %.3f 0.000 0.000 0.000 0.000 0.000 %s"),dzlabp.at(j).x-basePx,dzlabp.at(j).y-basePy,dzLabStr.at(j));
       s.WriteString(tstr);
      }
      //找到基 也就是标高值 因为读的是cad格式 所以
      for(j=0;j<csbaseLab.size();j++)
      {
       //第一个数据为10 表现基线信息 第二个表示基线点高程即中桩点的标注 第4个为基线起点的高程即hsg的值?
       tstr.Format(_T("\n10 %s"),csbaseLab.at(j));
       s.WriteString(tstr);
      }
      //地质钻孔的个数
      for(j=0;j<dzdrillp.size();j++)
      {
       tstr.Format(_T("\n31 0 0 0 %d %.3f %.3f"),dzdrillp.size(),dzdrillp.at(j).x-basePx,dzdrillp.at(j).y-basePy);
       s.WriteString(tstr);
      }
      //地质钻孔文字标注
      for(j=0;j<dzWZLab.size();j++)
      {
       tstr.Format(_T("\n32 %.3f %.3f 0 0 0 0 0 %s"),dzWZLabp.at(j).x-basePx,dzWZLabp.at(j).y-basePy,dzWZLab.at(j));
       s.WriteString(tstr);
      }
      //即有线信息hjgLineName hjgDis
      for(j=0;j<hjgDis.size();j++)
      {
       tstr.Format(_T("\n51 %s %s"),hjgLineName.at(j),hjgDis.at(j));
       s.WriteString(tstr);
      }
     }
    }
   }
   catch(...)
   {
    acutPrintf(_T("\n,code has problem!"));
   }
  }//if
}

评分

参与人数 1D豆 +5 收起 理由
marting + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2018-3-26 10:50:52 | 显示全部楼层
st788796 发表于 2017-8-7 15:00
这样开发不是一般的累

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

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-3-26 11:25:48 | 显示全部楼层
czike 发表于 2018-3-26 10:50
那大神 还有什么好的开发办法吗?

随用随生成,不要开始就把你自己想到的都保存,因为用户的需要是各样的,你不会想全。代码要能根据条件,去生成需要的数据。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 18:19 , Processed in 0.381641 second(s), 56 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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