乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 45|回复: 3

菜鸟求助!折腾了我一下午的问题

[复制链接]

9

主题

11

帖子

2

银币

初来乍到

Rank: 1

铜币
47
发表于 2007-4-30 17:08:00 | 显示全部楼层 |阅读模式
以下是我所编写的一段代码,目的是将2条重合的线合并成一条.编译可以通过,但在CAD上运行老是出错.本菜鸟对ARX 实在不熟,对此问题也是实在没折了,万望各位大侠,不吝赐教.
// ObjectARX defined commands
#include "StdAfx.h"
#include "StdArx.h"
#include "myline.h"
AcGePoint3d get_startpoint,get_endpoint;
AcGePoint3d judgement(Cmyline Cmyline1,Cmyline Cmyline2);
// This is command 'REPLINE'
void zzh_hfutrepline()
{
// TODO: Implement the command
    AcDbBlockTable *pBT;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBT,AcDb::kForRead);//取出当前数据库的实体表
   
AcDbBlockTableIterator* pIterator;
pBT->newIterator(pIterator);
pBT->close();
AcDbLine *pLine[20],*pLine1;
Cmyline myline1[20];                 //自己定义的直线类,用于存储各个直线的端点

  int i=0,Count=0;
for (pIterator->start();!pIterator->done();pIterator->step())
{
  AcDbBlockTableRecord *pBTR;
  pIterator->getRecord(pBTR,AcDb::kForRead,Adesk::kFalse);
  AcDbBlockTableRecordIterator* pIrterator;
  pBTR->newIterator(pIrterator);          //建立迭代器  
  pBTR->close();
   while(!pIrterator->done())
  {
   AcDbEntity*pEnt;
   pIrterator->getEntity(pEnt,AcDb::kForWrite); //打开实体,进行编辑
   if (pEnt->isA() == AcDbLine::desc())//若是线形,则继续
   {
    pLine[i]=AcDbLine::cast(pEnt);
   
    myline1[i].startpt=pLine[i]->startPoint();//将直线的两端点加以保存
    myline1[i].endpt=pLine[i]->endPoint();
   
    pIrterator->step();
    i++;
    Count++;
   }
  }
  }
  delete pIrterator;
}
for (i=0; iworkingDatabase()
       ->getSymbolTable(pBT,AcDb::kForWrite);
   
             pBT->getAt(ACDB_MODEL_SPACE, pBTR,AcDb::kForWrite);
    delete pLine[i];//删除图上的重复的线(这里错的吧 我不知道怎么删除线 相关资料没找到)
    delete pLine[j];
    pLine1=new AcDbLine(get_startpoint,get_endpoint);//重画一条线代替重复的两条线
    pLine1->close();
   
   }
  }
  
  for (i=0;iclose();
   delete pIterator;
}
AcGePoint3d judgement(Cmyline Cmyline1,Cmyline Cmyline2)
{
double fslope1,fslope2;//斜率
double Sx1,Sy1,Ex1,Ey1;//比较时用到的第一条直线的两个端点坐标变量
double Sx2,Sy2,Ex2,Ey2;//第二条直线端点坐标变量
Sx1=Cmyline1.startpt.x;
Sy1=Cmyline1.startpt.y;
Ex1=Cmyline1.endpt.x;
Ey1=Cmyline1.endpt.y;
Sx2=Cmyline2.startpt.x;
Sy2=Cmyline2.startpt.y;
Ex2=Cmyline2.endpt.x;
Ey2=Cmyline2.endpt.y;
fslope1=(Ey1 - Sy1) / (Ex1 - Sx1);
fslope2=(Ey2 - Sy2) / (Ex2 - Sx2);
double Max_distance,distance1,distance2,distance3,distance4;
distance1 = (Sx1 - Ex1) * (Sx1 - Ex1) + (Sy1 - Ey1) * (Sy1 - Ey1);//第一条直线两端点间的距离
distance2 = (Sx2 - Ex2) * (Sx2 - Ex2) + (Sy2 - Ey2) * (Sy2 - Ey2);//第二条直线两端点间的距离
distance3 = (Sx1 - Ex2) * (Sx1 - Ex2) + (Sy1 - Ey2) * (Sy1 - Ey2);//第一条直线起点于第二条直线终点间的距离
distance4 = (Sx2 - Ex1) * (Sx2 - Ex1) + (Sy2 - Ey1) * (Sy2 - Ey1);//第一条直线终点与第二条直线起点间的距离
if ((fslope1==fslope2)
  &&((Sy2==(Sx2-Sx1)*fslope1+Sy1)||(Ey2=(Ex2-Sx1)*fslope1+Sy1))
  &&((Sx1Max_distance)
   Max_distance=distance2;
  if (distance3>Max_distance)
   Max_distance=distance3;
  if (distance4>Max_distance)
   Max_distance=distance4;
  
     if (Max_distance==distance1)
  { get_startpoint.x=Sx1;
   get_startpoint.y=Sy1;
   get_endpoint.x=Ex1;
   get_endpoint.y=Ey1;
  }
   
     else if (Max_distance==distance2)
  {
   get_startpoint.x=Sx2;
      get_startpoint.y=Sy2;
   get_endpoint.x=Ex2;
   get_endpoint.y=Ey2;
  }
  else if (Max_distance==distance3)
  {
   get_startpoint.x=Sx1;
   get_startpoint.y=Sy1;
   get_endpoint.x=Ex2;
   get_endpoint.y=Ey2;
  }
  else if (Max_distance==distance4)
  {
   get_startpoint.x=Sx2;
   get_startpoint.y=Sy2;
   get_endpoint.x=Ex1;
  get_endpoint.y=Ey1;
  }
  else
  {
   ads_printf("\n error please restart the program !");
  
  }
}
return get_endpoint,get_startpoint;(是不是可以返回两个值,我不太清楚)

}

回复

使用道具 举报

10

主题

131

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
171
发表于 2007-5-2 00:49:00 | 显示全部楼层
myline1[i].startpt=pLine[i]->startPoint();//将直线的两端点加以保存
    myline1[i].endpt=pLine[i]->endPoint();
pEnt->erase();
pEnt->close();
回复

使用道具 举报

10

主题

131

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
171
发表于 2007-5-2 01:03:00 | 显示全部楼层
其实不用这么复杂,记住一条线的端点坐标后,再用后来的线端点逐一与它比较,如果相差不大就删掉后面的线.打开实体时一定要试试是不是能以写打开,否则CAD就崩了
好像用选择集更好
回复

使用道具 举报

9

主题

11

帖子

2

银币

初来乍到

Rank: 1

铜币
47
发表于 2007-5-2 12:54:00 | 显示全部楼层
问题已经解决 结贴
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-6 01:47 , Processed in 0.458913 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表