明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3388|回复: 6

[求助]关于拾取点获得点坐标

[复制链接]
发表于 2005-9-9 08:43:00 | 显示全部楼层 |阅读模式

在ARX中
1.如何通过pick图形上的点获得点坐标
2.如何通过pick图形上的直线获得两端endpoint的坐标和中点midpoint的坐标

关于第一个问题我选择了acedGetPoint()
但是根据函数定义
int acedGetPoint(
const ads_point pt,
const char *prompt,
ads_point result);
这个函数返回RTNORM等值(这类值是否是整形的?)
函数说明中说该函数将pt与result认为三维点,那么ads_point类型与AcGePoint3d这种类型有什么区别?
是否能通过该函数输出pick的点的三维坐标,如果可以的话使用哪个参数输出,类型上需要如何转换?

关于第二个问题我查了一下
有如下几个函数
AcGePoint3d endPoint() const;
AcGePoint3d midPoint() const;
acedGetPoint()

为了达到我的要求应该选用哪几个函数?能否提供一小段代码让我研究一下

谢谢

发表于 2005-9-9 09:56:00 | 显示全部楼层
可以到xdcad.net上面翻翻置顶的例子
发表于 2005-9-9 19:27:00 | 显示全部楼层

给你个参考

void  iterate(AcDbObjectId plineId)
{  //遍历多义线的顶点  并且打印出每个顶点的坐标
 AcDb2dPolyline *pPline;
 acdbOpenObject(pPline,plineId,AcDb::kForRead);

 AcDbObjectIterator*pVertIter = pPline->vertexIterator();
 pPline->close();

 AcDb2dVertex *pVertex;
 AcGePoint3d  location;
 AcDbObjectId  vertexObjId;

 for(int  vertexNumber=0;!pVertIter->done();
   vertexNumber++,pVertIter->step())
   {
    vertexObjId=pVertIter->objectId();
    acdbOpenObject(pVertex,vertexObjId,AcDb::kForRead);

    location=pVertex->position();
    pVertex->close();

    acutPrintf("\n顶点 # %d的位置为:%0.3f,%0.3f,%0.3f",vertexNumber,
     location[X],location[Y],location[Z]);
   }
   delete pVertIter;
}

发表于 2005-9-9 20:43:00 | 显示全部楼层

`~

帮你顶

 楼主| 发表于 2005-9-11 11:10:00 | 显示全部楼层

谢谢楼上几位,我先研究一下

过几天报告研究结果^_^

 楼主| 发表于 2005-9-16 10:26:00 | 显示全部楼层

报告一下我的学习成果

我用ObjectARX Project写了如下的代码

实现的功能是在当前绘图中pick点,将点坐标存在SQL Server数据库中的同时将pick的点顺序连线

此代码编译通过且加载ARX后实现预期功能

但在关闭AutoCAD时,无论选择是否保存都会导致AutoCAD非正常退出(保存能成功)

请帮我看看这段程序的bug在哪里,帮我完善一下,谢谢

#include "StdAfx.h"

CString xpt[100];
CString ypt[100];
float xco[100];
float yco[100];
//-----------------------------------------------------------------------------
#define szRDS _RXST("lemon")

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CPickPointApp : public AcRxArxApp {

public:
 CPickPointApp () : AcRxArxApp () {}

 virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  // TODO: Add your initialization code here

  return (retCode) ;
 }

 virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  // TODO: Add your code here

  return (retCode) ;
 }

 virtual void RegisterServerComponents () {
 }


 // ----- lemonPickPoint.pp command (do not rename)
 static void lemonPickPointpp(void)
 {
  // Add your code for command lemonPickPoint.pp here
  
  ads_point pt;
  int NodeNumCount;  //定义节点数,即最大的节点编号数值
  acedGetInt("Please input the node number:",&NodeNumCount);
  for(int i=0;i<NodeNumCount;i++)
  {
      if(acedGetPoint(NULL,"\nPick a point:",pt)==RTNORM)
      {
           xpt.Format("%g",pt[X]);
           ypt.Format("%g",pt[Y]);
           acutPrintf("\nThe coordinates of the point is:%s,%s",xpt,ypt);
      }
  }

  _ConnectionPtr m_pConnection;
  AfxOleInit();
        HRESULT hr;
 
  hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
  if(SUCCEEDED(hr))
  {
      hr = m_pConnection->Open("Provider=SQLOLEDB;Data Source=CZQDAY;User ID=saassword=820306;Initial Catalog=TOSHIBA1","","",adModeUnknown);///连接数据库
  }
      
     try
  { 
            _variant_t varProjectID,varID,varx,vary;
            for(int i=0;i<NodeNumCount;i++)              
   {
    atof(xpt);
    atof(ypt);
    varProjectID = "as001";
    varID = i+1;
       varx = xpt;
       vary = ypt;
       _RecordsetPtr t_pRecordset;
    t_pRecordset.CreateInstance("ADODB.Recordset");
          t_pRecordset->Open("SELECT * FROM xy",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
          t_pRecordset->MoveFirst();
    t_pRecordset->AddNew();
          t_pRecordset->utCollect("ProjectID",varProjectID);
          t_pRecordset->utCollect("id",varID);
       t_pRecordset->utCollect("x",varx);
    t_pRecordset->utCollect("y",vary);
          t_pRecordset->Update();//只有写了这句才能刷新数据库!!
   
    //Refresh();//只有运行这个函数,才能保存成功
    t_pRecordset->Close(); 
   }
        }
        catch(_com_error e)///捕捉异常
     {
      AfxMessageBox("保存不成功!");///显示错误信息
     }

                //更改数据类型,CString->float
  for (int j=0;j<NodeNumCount;j++)
  {
   xco[j]=atof(xpt[j]);
                        yco[j]=atof(ypt[j]);
  }

                //pick点,连续画直线
  AcDbBlockTableRecord *pBlkTableRcd
   =new AcDbBlockTableRecord();//创建块表记录
  //以写方式得到当前块表的指针
  AcDbBlockTable *pBlkTable=NULL; 
  acdbHostApplicationServices()->workingDatabase()
   ->getSymbolTable(pBlkTable, AcDb::kForWrite);
        //将新的块表记录加入块表中,并获得块表记录的ID
  AcDbObjectId Id;
  pBlkTable->add(Id, pBlkTableRcd);
  pBlkTable->close();

        for(int k=0;k<NodeNumCount;k++)
  {
   //生成直线
      AcGePoint3d startPt(xco[k],yco[k],0.0);//定义直线起点
            AcGePoint3d endPt(xco[k+1],yco[k+1],0.0);//定义直线终点
   AcDbLine *pLine=new AcDbLine(startPt,endPt);
      AcDbBlockTable *pBlkTable2=NULL;
            acdbHostApplicationServices()->workingDatabase()
                ->getSymbolTable(pBlkTable2, AcDb::kForRead);

            pBlkTable2->getAt(ACDB_MODEL_SPACE, pBlkTableRcd,
                AcDb::kForWrite);
   pBlkTable2->close();

            AcDbObjectId lineId;
            pBlkTableRcd->appendAcDbEntity(lineId, pLine);
            pLine->setLayer("Layer_Frame");//设置创建轮廓线的层为"Layer_Frame"
   pLine->close();
  }
  pBlkTableRcd->close();


 }


} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CPickPointApp)

ACED_ARXCOMMAND_ENTRY_AUTO(CPickPointApp, lemonPickPoint, pp, pp, ACRX_CMD_TRANSPARENT, NULL)

发表于 2005-9-18 13:01:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 04:44 , Processed in 0.162599 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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