zoukankan      html  css  js  c++  java
  • ////////////////////创建窗体图层"Window_Layer"/////////////////

    ////////////////////创建窗体图层"Window_Layer"/////////////////
    AcDbObjectId
    createWindowsLayer()
    {
    //打开层表,打开方式为只写///
    AcDbLayerTable *pLayerTable;
    acdbHostApplicationServices()->workingDatabase()
    ->getSymbolTable(pLayerTable,AcDb::kForWrite);
    //初始化层表记录对象,并设定层表记录的名称“Window_Layer”

    AcDbLayerTableRecord *pLayerTableRecord=new AcDbLayerTableRecord;
    pLayerTableRecord->setName("Window_Layer");

    AcCmColor color;
    color.setColorIndex(1); // set color to red

    pLayerTableRecord->setColor(color);
    //层的其他属性(线型等)都用缺省值////

    //将新建的层表记录添加到层表中,并将层表记录的ID保存到pLayerId作为函数的返回值////

    AcDbObjectId pLayerId;
    pLayerTable->add(pLayerId,pLayerTableRecord);
    //关闭层表和层表记录对象///
    pLayerTable->close();
    pLayerTableRecord->close();

    return pLayerId;
    }

    ///*************在指定点插入指定块*******************///
    void CTestPlate::OnBlockInsert()
    {
    // TODO: Add your control notification handler code here
    acDocManager->lockDocument(curDoc());
    AcDbObjectId blockId; //要插入的块的Id值
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()
    ->getSymbolTable(pBlockTable,AcDb::kForRead);
    Acad::eOk!=pBlockTable->getAt("ASDK-NO-ATTR",
    blockId,AcDb::kForRead)//根据块名获得要插入的块的ID值
    AcDbBlockReference *pBlkRef=new AcDbBlockReference;//插入块实质是插入块的引用
    pBlkRef->setBlockTableRecord(blockId);//指定所引用的图块表记录的对象ID
    resbuf to,from;
    from.restype=RTSHORT;//插入图块要进行用户坐标与世界坐标的转换
    from.resval.rint=1;//UCS
    to.restype=RTSHORT;
    to.resval.rint=0;//WCS
    AcGeVector3d normal(0.0,0.0,1.0);
    acedTrans(&(normal.x),&from,&to,Adesk::kTrue,&(normal.x));//转换函数
    AcGePoint3d basePoint(12,23,0);//指定的插入点(可以根据需要输入)
    //acedGetPoint(NULL,"/nEnter insertion point:",asDblArray(basePoint));
    pBlkRef->setPosition(basePoint);
    pBlkRef->setRotation(0.0);
    pBlkRef->setNormal(normal);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
    pBlockTable->close();
    AcDbObjectId newEntId;
    pBlockTableRecord->appendAcDbEntity(newEntId,pBlkRef);
    pBlockTableRecord->close();
    pBlkRef->close();
    acDocManager->lockDocument(curDoc());
    }

    //點遷多義線中之一直線,獲得線段之位置(圓弧可自行補上)
    void GetPolyLineSelectLineIndex(AcDbPolyline *Poly,AcGePoint3d SelectPt,int Index)
    {
    AcGePoint2d tempPt;
    double Distance=11111111;
    tempPt.x=SelectPt.x;
    tempPt.y=SelectPt.y;
    AcDbVoidPtrArray entitySet;
    Poly->explode(entitySet);
    for(int i=0;i {
    AcDbEntity *pEnt;
    pEnt=AcDbPolyline::cast((AcRxObject*)entitySet[i]);
    if(pEnt->isA()==AcDbLine::desc())
    {
    AcDbLine *pLine=AcDbLine::cast(pEnt);
    AcGePoint2d StPt,EndPt;
    StPt.x=pLine->startPoint().x;
    StPt.y=pLine->startPoint().y;
    EndPt.x=pLine->endPoint().x;
    EndPt.y=pLine->endPoint().y;
    pLine->close();
    AcGeLine2d GeLine(StPt,EndPt);
    double pama=0;
    if((GeLine.isOn(tempPt,pama)==Adesk::kTrue)&&pama<=1&&pama>=0)
    {
    Index=i;
    break;
    }
    else
    {
    if(GeLine.distanceTo(tempPt) {
    AcGeLine2d tempLine;
    GeLine.getPerpLine(tempPt,tempLine);
    AcGePoint2d InsertPt;
    GeLine.intersectWith(tempLine,InsertPt);
    double pama=0;
    if((GeLine.isOn(InsertPt,pama)==Adesk::kTrue)&&pama<=1&&pama>=0)
    {
    Distance=GeLine.distanceTo(tempPt);
    Index=i;
    }
    }
    }
    }
    pEnt->close();
    }
    }

    int unionSolid(AcDbObjectId extrudeId,AcDb3dSolid *&pSolid)
    {
    //打开切弧实体 pExtrude
    AcDb3dSolid *pExtrude;
    if (Acad::eOk!=acdbOpenObject(pExtrude,extrudeId,AcDb::kForWrite)){
    acutPrintf("/nError: Invalid extrude solid! ");
    if(pExtrude!=NULL) pExtrude->close();
    return RTERROR;
    }
    if(pExtrude==NULL){
    acutPrintf("/nError: Invalid extrude solid! ");
    return RTERROR;
    }

    // 实体
    if(pSolid==NULL){
    acutPrintf("/nError: Invalid extrude solid! ");
    return RTERROR;
    }
    //Unit
    if(Acad::eOk!=pSolid->booleanOper(AcDb::kBoolUnite,pExtrude))
    {
    acutPrintf("/nError: substract error!");
    pExtrude->close();
    return RTERROR;
    }
    pExtrude->close();
    return RTNORM;
    }

    Acad::ErrorStatus DyZoom(AcGePoint2d CenterPt,double Height,double Width)
    {
    Acad::ErrorStatus es;
    AcDbViewTableRecord *view=new AcDbViewTableRecord();
    view->setCenterPoint(CenterPt);
    view->setFrontClipAtEye(false);
    view->setHeight(Height);
    view->setWidth(Width);
    es=acedSetCurrentView(view,NULL);
    view->close();
    delete view;
    view=NULL;
    return es;
    }


    创建circle和newlayer(加了错误检查的代码)
    Acad::ErrorStatus
    createCircle(AcDbObjectId& circleId)
    {
    circleId = AcDbObjectId::kNull;

    AcGePoint3d center(9.0,3.0,0.0);
    AcGeVector3d normal(0.0,0.0,0.1);
    AcDbCircle*pCirc=new AcDbCircle(center,normal,2.0);

    if(pCirc==NULL)
    return Acad::eOutOfMemory;

    AcDbBlockTable*pBlockTable;
    Acad::ErrorStatus es=
    acdbHostApplicationServices()->workingDatabase()->
    getSymbolTable(pBlockTable,AcDb::kForRead);
    if(es!=Acad::eOk)
    {
    delete pCirc;
    return es;
    }

    AcDbBlockTableRecord*pBlockTableRecord;
    es=pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
    if(es!=Acad::eOk){
    Acad::ErrorStatus es2=pBlockTable->close();
    if (es2!=Acad::eOk){
    acrx_abort("/n应用程序X关闭边失败,错误码为:%d",
    acadErrorStatusText(es2));
    }
    delete pCirc;
    return es;
    }

    es=pBlockTable->close();
    if (es!=Acad::eOk)
    {
    acrx_abort("/n应用程序X关闭边失败,错误码为:%d",
    acadErrorStatusText(es));
    }
    es=pBlockTableRecord->appendAcDbEntity(circleId,pCirc);
    if(es!=Acad::eOk){
    Acad::ErrorStatus es2=pBlockTableRecord->close();
    if (es2!=Acad::eOk){
    acrx_abort("/n应用程序X关闭模型空间块表记录失败,错误码为:%s",
    acadErrorStatusText(es2));
    }
    delete pCirc;
    return es;
    }

    es=pBlockTableRecord->close();
    if(es!=Acad::eOk)
    {
    acrx_abort("/n应用程序X关闭模型空间块表记录失败,错误码为:%d",
    acadErrorStatusText(es));
    }

    es=pCirc->close();
    if(es!=Acad::eOk){
    acrx_abort("/n应用程序X关闭实体失败,错误码为:%d",
    acadErrorStatusText(es));
    }
    return es;
    }


    Acad::ErrorStatus
    createNewLayer()
    {
    AcDbLayerTableRecord*pLayerTableRecord=new AcDbLayerTableRecord;

    if (pLayerTableRecord==NULL)
    return Acad::eOutOfMemory;

    Acad::ErrorStatus es
    =pLayerTableRecord->setName("ASDK_MYLAYER");
    if(es!=Acad::eOk)
    {
    delete pLayerTableRecord;
    return es;
    }

    AcDbLayerTable*pLayerTable;
    es=acdbHostApplicationServices()->workingDataBase()->
    getSymbolTable(pLayerTable,AcDb::kForWrite);
    if(es!=Acad::eOk){
    delete pLayerTableRecord;
    return es;
    }
    //由于先型对象ID的缺省直是0,不是有效的ID,必须将其设置为有效的ID,
    //即CONTINUOUS线型。其他数据成员都为有效缺省值,因此不须对其进行设置
    AcDbLinetypeTable*pLinetypeTbl;
    es=acdbHostApplicationServices()->workingDatabase()->
    getSymbolTable(pLinetypeTbl,AcDb::kForRead);
    if (es!=Acad::eOk){
    delete pLayerTableRecord;
    es=pLayerTable->close();

    if(es!=Acad::eOk){
    acrx_abort("/n应用程序X关闭实体失败,错误码为:%d",
    acadErrorStatusText(es));
    }
    return es;
    }

    AcDbObjectId ltypeobjId;
    es=pLinetypeTbl->getAt("CONTINUOUS",ltypeObjId);
    if (es!=Acad::eOk){
    delete pLayerTableRecord;
    es=pLayerTable->close();
    if (es!=Acad::eOk){
    acrx_abort("/n应用程序X关闭实体失败,错误码为:%d",acadErrorStatusText(es));
    }
    return es;
    }

    pLayerTableRecord->setLinetypeObjectId(ltypeObjId);
    es=pLayerTable->add(pLayerTableRecord);
    if (es!=Acad::eOk)
    {
    Acad::ErrorStatus es2=pLayerTable->close();
    if (es2!=Acad::eOk)
    {

    acrx_abort("/n应用程序X关闭实体失败,错误码为:%d",
    acadErrorStatusText(es2));
    }
    delete pLayerTableRecord;
    return es;
    }

    es=pLayerTable->close();
    if(es!=Acad::eOk)
    {
    acrx_abort("/n应用程序X关闭实体失败,错误码为:%d",
    acadErrorStatusText(es));
    }
    es=pLayerTableRecord->close();
    if(es!=Acad::eOk)
    {
    acrx_abort("/n应用程序X关闭实体失败,错误码为:%d",
    acadErrorStatusText(es));
    }
    return es;
    }


    Function name: setEntityElevation
    Parameters: ads_name, double
    Return value: False or True

    According to the Entity name setting the elevation value of text,polyline,2dpolyline,block,hatch which is given
    BOOL setEntityElevation(ads_name en, double elevation)
    { AcDbEntity* pEnt;
    AcDbObjectId eId;

    if(acdbGetObjectId(eId, en) != Acad::eOk) return FALSE;
    if(acdbOpenObject(pEnt,eId,AcDb::kForWrite) != Acad::eOk) return FALSE;
    if(!pEnt) { acutPrintf("/nFail to open Database!!"); return FALSE; }

    if(pEnt->isKindOf(AcDbPolyline::desc())) {
    ((AcDbPolyline*)pEnt)->setElevation(elevation);
    pEnt->close(); // Finished with the pEnt header.
    }
    else if(pEnt->isKindOf(AcDb2dPolyline::desc())) {
    ((AcDb2dPolyline*)pEnt)->setElevation(elevation);
    pEnt->close(); // Finished with the pEnt header.
    }
    else if(pEnt->isKindOf(AcDbText::desc())) {
    AcGePoint3d point3d;
    point3d = ((AcDbText*)pEnt)->position();
    point3d[2] = elevation;
    ((AcDbText*)pEnt)->setPosition(point3d);
    pEnt->close(); // Finished with the pEnt header.
    }
    else if(pEnt->isKindOf(AcDbMText::desc())) {
    AcGePoint3d point3d;
    point3d = ((AcDbMText*)pEnt)->location();
    point3d[2] = elevation;
    ((AcDbMText*)pEnt)->setLocation(point3d);
    pEnt->close(); // Finished with the pEnt header.
    }
    else if(pEnt->isKindOf(AcDbBlockReference::desc())) {
    AcGePoint3d point3d;
    point3d = ((AcDbBlockReference*)pEnt)->position();
    point3d[2] = elevation;
    ((AcDbBlockReference*)pEnt)->setPosition(point3d);
    pEnt->close(); // Finished with the pEnt header.
    }
    else if(pEnt->isKindOf(AcDbShape::desc())) {
    AcGePoint3d point3d;
    point3d = ((AcDbShape*)pEnt)->position();
    point3d[2] = elevation;
    ((AcDbShape*)pEnt)->setPosition(point3d);
    pEnt->close(); // Finished with the pEnt header.
    }
    else if(pEnt->isKindOf(AcDbHatch::desc())) {
    ((AcDbHatch*)pEnt)->setElevation(elevation);
    pEnt->close(); // Finished with the pEnt header.
    }
    else { pEnt->close(); return FALSE; }
    return TRUE;

    读取CAD线型文件

    class CLinetypeParam
    {
    public:
    CLinetypeParam();
    CLinetypeParam(CString v_strName, CString v_strView);
    virtual ~CLinetypeParam();

    public:
    CString m_strName; //线型名
    CString m_strView; //线型描述
    };

    typedef CArray<CLinetypeParam,CLinetypeParam> AryLinetype;

    BOOL CBaseInf:ReadLineTypeFile(AryLinetype &v_Param,
                 CString v_strPath)
    {
    char szPath[MAX_PATH];
    if (ads_findfile(v_strPath,szPath) != RTNORM)
    {
       ads_printf("Could not find file %s./n", v_strPath);
       return FALSE;
    }

    CLinetypeParam TempParam;
    TempParam.m_strName = _T("CONTINUOUS");
    TempParam.m_strView = _T("_______________________________________");   
    //v_Param.Add(CLinetypeParam("CONTINUOUS",
    // "_______________________________________"));
    v_Param.Add(TempParam);

    CStdioFile DateFile;
    CFileException e;
    CString strTemp = _T("");
    if( !DateFile.Open(szPath, CFile::modeRead, &e ) )
    {
       ads_printf("Could not open file %s./n", v_strPath);
       return FALSE;
    }
    while(DateFile.ReadString(strTemp))
    {
       int nSt = strTemp.Find('*');
       int nMi = strTemp.Find(',');
       if(nSt != -1 && nSt != -1 && nSt < nMi)
       {
        CLinetypeParam TempParam;
        TempParam.m_strName = strTemp.Mid(nSt+1,nMi-nSt-1);
        TempParam.m_strView = strTemp.Mid(nMi+1);   
        v_Param.Add(TempParam);
       }
    }
    DateFile.Close();

    return TRUE;
    }
    良好的使用Arx提供的几何类

    void CGeoByArx::convertArc2Arc( AcGeCircArc3d*pGeArc, AcDbArc*&pDbArc )
    {
    AcGePoint3d center = pGeArc->center();
    AcGeVector3d normal = pGeArc->normal();
    AcGeVector3d refVec = pGeArc->refVec();
    AcGePlane plane = AcGePlane(center, normal);
    double ang = refVec.angleOnPlane(plane);
    pDbArc = new AcDbArc(center, normal, pGeArc->radius(),pGeArc->startAng() +
       ang, pGeArc->endAng() + ang );
    }

    void CGeoByArx::convertArc2Arc( AcDbArc*pDbArc, AcGeCircArc3d*&pGeArc)
    {
    pGeArc = new AcGeCircArc3d(
       pDbArc->center(),
       pDbArc->normal(),
       pDbArc->no rmal().perpVector(),
       pDbArc->radius(),
       pDbArc->startAngle(),
       pDbArc->endAngle());
    }

    延高程三维实体切片[ARX程序]

    BOOL CSliceBody::DrawSliceBody(AcDbObjectIdArray& idArray)
    {
    AcDbEntity* pEnt=NULL;
    Acad::ErrorStatus es;
      
    double dMaxz(350),dMinz(300);
    double dHeight=5.0;
    //ads_printf("/n最高点高程为:%.2f/n最低点高程为:%.2f",dMaxz,dMinz);
    CString strTemp;
    strTemp.Format("/n请输入起始高程<%.2f>:",dMinz);
    if(ads_getreal(strTemp,&dMinz)!=RTCAN)
    {
       strTemp.Format("/n请输入终止高程<%.2f>:",dMaxz);
       if(ads_getreal(strTemp,&dMaxz)!=RTCAN)
       {
        strTemp.Format("/n请输入高程间距<%.2f>:",dHeight);
        if(ads_getreal(strTemp,&dHeight)!=RTCAN)
        {     
         int nCount=0;
         CArray<double,double> aryHeight;
         while (nCount*dHeight+dMinz<dMaxz+ZERO)
         {
          aryHeight.Add(nCount*dHeight+dMinz);
          nCount++;
         }
         if(aryHeight.GetSize()<1)
          return FALSE;
        
         for(int i=0;i<idArray.length();i++)
         {
          es = acdbOpenAcDbEntity(pEnt, idArray.at(i), AcDb::kForWrite);
          if(es != Acad::eOk)
          {
           ads_printf("/nacdbOpenAcDbEntity错误");   
           return FALSE;
          }
          if (pEnt == NULL)
           continue;
         
          if(pEnt->isKindOf(AcDb3dSolid::desc()))//如果是Curve类
          {
           ////////////////////////////////////////////////////////////////////////////////   
           /*
           double volume;
           AcGePoint3d centroid;
           double momInertia[3];
           double prodInertia[3];
           double prinMoments[3];
           AcGeVector3d prinAxes[3];
           double radiiGyration[3];
           AcDbExtents extents;
           */
           ////////////////////////////////////////////////////////////////////////////////
           AcDb3dSolid* p3dSolid=NULL;     
           p3dSolid=AcDb3dSolid::cast(pEnt);
           int nColor=1;      
           if(p3dSolid!=NULL)
           {
            //p3dSolid->getMassProp(volume,centroid,momInertia,prodInertia,
            // prinMoments,prinAxes,radiiGyration,extents);
            for(int j=0;j<aryHeight.GetSize();j++)
            {
             AcGePlane plane;
             plane.set(AcGePoint3d(0,0,aryHeight.GetAt(j)),AcGeVector3d(0,0,1));

             AcDb3dSolid* pNewSolid=NULL;
             if(p3dSolid->getSlice(plane,Adesk::kTrue,pNewSolid)==Acad::eOk)
             {
              if(pNewSolid!=NULL)
              {
               TURNCOLOR(nColor)
               pNewSolid->setColorIndex(nColor);
               CTszDwg::AddEntity(pNewSolid);
               pNewSolid->close();
              }
             }        
            }
            if(p3dSolid!=NULL)
            {
             TURNCOLOR(nColor)
             p3dSolid->setColorIndex(nColor);
             CTszDwg::AddEntity(p3dSolid);
             p3dSolid->close();
            }
           }
          }
          pEnt->close();  
         }
        }
       }
    }  
      
    return TRUE;
    }

    /////////////////////////////////////////////////////////////////////////
    // Cad颜色编辑框
    //////////////////////////////////////////////////////////////////////////
    class CCadColorEdit : public CListCtrlEdit
    {
    // Construction
    public:
    CCadColorEdit();

    // Attributes
    public:


    // Operations
    public:

    // Overrides
    // Clazard generated virtual function overrides
    //{{AFX_VIRTUAL(CCadColorEdit)
    //}}AFX_VIRTUAL

    // Implementation
    public:
    virtual ~CCadColorEdit();

    private:
    CString m_Text;

    // Generated message map functions
    protected:
    CBrush m_Brush;
    COLORREF m_curColor;
    //{{AFX_MSG(CCadColorEdit)
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnPaint();
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
    };

    class CLayerParam;
    //////////////////////////////////////////////////////////////////////////
    // Cad颜色编辑框
    //////////////////////////////////////////////////////////////////////////
    CCadColorEdit::CCadColorEdit()
    {
    m_curColor=RGB(255,255,255);
    }

    CCadColorEdit::~CCadColorEdit()
    {
    }


    BEGIN_MESSAGE_MAP(CCadColorEdit, CListCtrlEdit)
    //{{AFX_MSG_MAP(CLayerCtrl)
    ON_WM_PAINT()
    ON_WM_LBUTTONDOWN()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    void CCadColorEdit::OnPaint()
    {
    CPaintDC dc(this); // device context for painting
    GetWindowText(m_Text);
    // Delete the old brush
    m_Brush.DeleteObject();
    //m_Brush.CreateSolidBrush(RGB(255,255,255));
    CDC* pDC = GetDC();
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetBkColor(RGB(255,255,255));
    pDC->SelectObject(&m_Brush);
    CRect rc;
    GetClientRect(&rc);
    ScreenToClient(&rc);  
    pDC->Rectangle(0, 0, rc.Width(), rc.Height());
    m_Brush.CreateSolidBrush(m_curColor);
    pDC->SelectObject(&m_Brush);
    pDC->Rectangle(2, 3, 20, rc.Height()-3);
    pDC->SetTextColor(RGB(0, 0, 0));
    pDC->TextOut(23, 0, m_Text.GetBuffer(m_Text.GetLength()));
    }


    void CCadColorEdit::OnLButtonDown(UINT nFlags, CPoint point)
    {
    // TOD Add your message handler code here and/or call default
    //CEdit::OnLButtonDown(nFlags, point);

    //acedSetColorDialog(int& nColor,Adesk::Boolean bAllowMetaColor,  
    // int nCurLayerColor);

    int nColor;
    GetWindowText(m_Text);
    nColor=atoi(m_Text);
    if(acedSetColorDialog(nColor,FALSE,256)==IDOK)
    {
       m_Text.Format("%d",nColor);
       SetWindowText(m_Text);
       m_curColor=acdbGetRGB(nColor);  
    }
    }

    AcDbDatabase* pDb=acdbCurDwg();
    AcDbObjectId id1=AddTextStyle("jing6","宋体",pDb);
    AcDbObjectId id2=AddTextStyle("jing8","宋体",pDb);
    pDb->setTextstyle(id1);
    AcDbObjectId AddTextStyle(const char* strName,const char* strStype,AcDbDatabase* pDb)
    {
    AcDbObjectId idTextStyle=NULL;

    AcDbTextStyleTable *pTable=NULL;
    AcDbTextStyleTableRecord *pTableRecord;
    if (pDb==NULL)
       pDb=acdbCurDwg();
    pDb->getTextStyleTable(pTable,AcDb::kForWrite);

    if(pTable==NULL)
    {
       AfxMessageBox("字体表打开错误");
       return idTextStyle;
    }
    // 生成新的图层表记录
    pTable->getAt(ACDB_MODEL_SPACE,pTableRecord,AcDb::kForWrite);
    if(pTable->has(strName))
    {
       pTable->getAt(strName,idTextStyle);
    }
    else
    {
       pTableRecord=new AcDbTextStyleTableRecord;
       pTableRecord->setName(strName);  
       pTableRecord->setFont(strStype,FALSE,FALSE,200,100);
       pTableRecord->setTextSize(3.0);
      
       pTable->add(idTextStyle,pTableRecord);
       pTableRecord->close();
    }

    pTable->close();

    return idTextStyle;
    }


    //程序功能:根据某一点求得其在直线上的垂直点
    //输入参数:const AcGePoint3d v_ptStart   组成直线的起点
    //          const AcGePoint3d v_ptEnd     组成直线的终点
    //          const AcGePoint3d v_ptActive 要求的点
    //返回参数:求得的垂点
    AcGePoint3d CGeometry3D::GetUprightPoint(const AcGePoint3d v_ptStart,
                const AcGePoint3d v_ptEnd,
                const AcGePoint3d v_ptActive)
    {
    if(CGeometry3D::GetLength(v_ptStart,v_ptEnd)<ZERO)
       return v_ptStart;
    double dLineSt=CGeometry3D::GetLength(v_ptActive,v_ptStart);
    double dLineEd=CGeometry3D::GetLength(v_ptActive,v_ptEnd);
    double dLineSE=CGeometry3D::GetLength(v_ptStart,v_ptEnd);
    double dS1=(dLineSt+dLineEd+dLineSE)/2.0;
    double dS=dS1*(dS1-dLineSt)*(dS1-dLineEd)*(dS1-dLineSE);
    LJSQR(dS)
       double dUpRight=dS*2.0/dLineSE;
    double dM1=pow(dLineSt,2)-pow(dUpRight,2);
    double dM2=pow(dLineEd,2)-pow(dUpRight,2);
    LJSQR(dM1)
       LJSQR(dM2)
       AcGePoint3d UpRightPt;
    if(dM1>dLineSE||dM2>dLineSE)
    {
       if(fabs(dM1-dM2)>ZERO)
       {
        UpRightPt.x=(dM2*v_ptStart.x-dM1*v_ptEnd.x)/(dM2-dM1);
        UpRightPt.y=(dM2*v_ptStart.y-dM1*v_ptEnd.y)/(dM2-dM1);
        UpRightPt.z=(dM2*v_ptStart.z-dM1*v_ptEnd.z)/(dM2-dM1);
       }   
    }  
    else
    {
       if(fabs(dM1+dM2)>ZERO)
       {
        UpRightPt.x=(dM2*v_ptStart.x+dM1*v_ptEnd.x)/(dM1+dM2);
        UpRightPt.y=(dM2*v_ptStart.y+dM1*v_ptEnd.y)/(dM1+dM2);
        UpRightPt.z=(dM2*v_ptStart.z+dM1*v_ptEnd.z)/(dM1+dM2);
       }
    }
    return UpRightPt;
    }


    如何获得程序路径
    struct resbuf rb;

    char sTemp[1024],*str;

    ads_getvar("acadprefix",&rb);

    strcpy(sTemp,rb.resval.string);

    acad_free(rb.resval.rstring);

    str=strchr(sTemp,';');

    *str='/0';

    str=strrchr(sTemp,'//');

    *str='/0';

    上段程序中,sTemp中存储了安装CAD的目录
    AUTOCAD的系统变量存储了一些与安装有关的信息,虽然不多,在正常情况是够用的.与目录有关的主要有:

    dwgprefix 当前dwg图形存储的目录

    acadprefix   acad环境变量存储的目录

    dwgname   当前dwg文件名

    savefile 当前自动存储文件名


    ///从RGB得到cad颜色索引值
    int getNearestACI(COLORREF color)
    {
    long acirgb, r,g,b;
    long mindst = 2147483647L;
    long dst = 0;
    int minndx = 0;
    long red=GetRValue(color);
    long green=GetGValue(color);
    long blue=GetBValue(color);
    for ( int i = 1; i < 255; i++ ) {
       acirgb = acdbGetRGB ( i );
       r =GetRValue(acirgb);
       g =GetGValue(acirgb);
       b =GetBValue(acirgb);
      
       dst = abs ( r-red) + abs ( g -green) + abs (b-blue);
       if ( dst < mindst ) {
        minndx = i;
        mindst = dst;
       }
    }
    return minndx;

    }  


    //功   能:从CAD的颜色得到RGB
    COLORREF CGlobal::GetColorFromIndex(int colorIndex)
    {
    if(colorIndex < 0 || colorIndex > 255)
    {
       ads_alert("传入的颜色号不在0~255之间!");
       return 0;
    }

    BYTE R, G, B;
    #ifdef ARX_2002_dll
    R = lpszRGBData[colorIndex*3+0];
    G = lpszRGBData[colorIndex*3+1];
    B = lpszRGBData[colorIndex*3+2];
    #else
    long zhi = acdbGetRGB(colorIndex);
    WORD LOW = LOWORD(zhi);
    WORD HIG = HIWORD(zhi);
    R = LOBYTE(LOW);
    G = HIBYTE(LOW);
    B = LOBYTE(HIG);
    #endif

    return RGB(R,G,B);

    //return acdbGetRGB(nColor);
    }

    获取AcDbDimension里的属性信息
    AcDbEntity *pEnt;
    AcDbObjectId id;
    AcGePoint3d ptPick;
    ads_name eName;
    if (acedEntSel ("Select a dimension: " , eName, asDblArray (ptPick)) != RTNORM )
    return;
    acdbGetObjectId (id, eName);
    acdbOpenAcDbEntity (pEnt, id, AcDb::kForRead);
    //----- Get the id of the block table record which owns the text entity
    AcDbDimension *pDim =AcDbDimension::cast (pEnt);
    if (pDim == NULL)
    {
    pEnt->close ();
    return;
    }

    id =pDim->dimBlockId ();
    pDim->close ();
    AcDbBlockTableRecord *pr;
    acdbOpenAcDbObject ((AcDbObject *&) pr, id, AcDb::kForRead);
    //----- Iterating the block table record
    AcDbBlockTableRecordIterator *pi;
    pr->newIterator (pi);
    while (!pi->done ())
    {
    pi->getEntity (pEnt, AcDb::kForRead);
    if (pEnt->isKindOf (AcDbMText::desc ()))
    {
    AcDbMText *pt = (AcDbMText *) pEnt;
    char *s = pt->contents ();
    acutPrintf (s);
    delete s;
    }
    pEnt->close();
    pi->step();
    }
    pr->close();

  • 相关阅读:
    out/host/linuxx86/obj/EXECUTABLES/aapt_intermediates/aapt 64 32 操作系统
    linux 查看路由器 电脑主机 端口号 占用
    linux proc进程 pid stat statm status id 目录 解析 内存使用
    linux vim 设置大全详解
    ubuntu subclipse svn no libsvnjavahl1 in java.library.path no svnjavahl1 in java.library.path no s
    win7 安装 ubuntu 双系统 详解 easybcd 工具 不能进入 ubuntu 界面
    Atitit.json xml 序列化循环引用解决方案json
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.跨语言  文件夹与文件的io操作集合  草案
    Atitit.atijson 类库的新特性设计与实现 v3 q31
  • 原文地址:https://www.cnblogs.com/mjgw/p/12392446.html
Copyright © 2011-2022 走看看