void createSmiley() { AcGePoint3d cen; struct resbuf rbFrom, rbTo; ads_getpoint( NULL, "\nCenter point: ", asDblArray( cen )); rbFrom.restype = RTSHORT; rbFrom.resval.rint = 1; // from UCS rbTo.restype = RTSHORT; rbTo.resval.rint = 0; // to WCS ads_trans( asDblArray( cen ), &rbFrom, &rbTo, Adesk::kFalse, asDblArray( cen )); AcGeVector3d x = acdbHostApplicationServices()->workingDatabase()->ucsxdir(); AcGeVector3d y = acdbHostApplicationServices()->workingDatabase()->ucsydir(); AcGeVector3d normalVec = x.crossProduct( y ); normalVec.normalize(); SmileyJig jig( cen, normalVec ); jig.start(); }
void SingleTunnelDraw::extendByLength( double length ) { AcGeVector3d v = m_endPt - m_startPt; v.normalize(); m_endPt = m_endPt + v * length; // 修改末点坐标 }
Adesk::Boolean TunnelDragJig::update() { AcGePlane plane; AcGeVector3d v = ept - spt; v.normalize(); v.rotateBy( 0.5 * PI, AcGeVector3d::kZAxis ); AcGeVector3d offset = curPt - basePt; double L = offset.dotProduct( v ); if( L == 0 ) return false; if( L < 0 ) { v.negate(); L = -1 * L; } AcGePoint3d newSpt = spt + v * L, newEpt = ept + v * L; // 更新工作面坐标 m_pWS->setSEPoint( newSpt, newEpt ); m_pWS->updateDraw(); return Adesk::kTrue; }
void DrawCmd::DrawWindLibrary( void ) { AcDbObjectId objId = ArxUtilHelper::SelectObject( _T( "请选择一条巷道:" ) ); if( objId.isNull() ) return; if( !ArxUtilHelper::IsEqualType( _T( "LinkedGE" ), objId ) ) return; AcGePoint3d pt,insertPt; double angle; if( !ArxUtilHelper::PromptPt( _T( "\n请指定风库的插入点坐标:" ), pt ) ) return; if( !GetClosePtAndAngle( objId, pt, angle ) ) return; AcGeVector3d v = AcGeVector3d(AcGeVector3d::kXAxis); v.rotateBy(angle - PI/2,AcGeVector3d::kZAxis); v.normalize(); insertPt = pt + v * 60; WindLibrary* pWindLib = new WindLibrary( insertPt, angle ); if( pWindLib == 0 ) return; pWindLib->setRelatedGE( objId ); // 关联巷道 // 初始化并提交到数据库 if( !ArxUtilHelper::PostToModelSpace( pWindLib ) ) delete pWindLib; }
AcGePoint3d DoubleTTunnelDraw::caclHeadPoint() { AcGeVector3d v = m_endPt - m_startPt; v.normalize(); // 单位方向向量 v = v * m_distance; return m_endPt + v; }
void DoubleTunnelDraw::extendByLength( double length ) { AcGeVector3d v = m_endPt - m_startPt; v.normalize(); m_endPt = m_endPt + v * length; // 更新末点坐标 update(); // 更新其它参数 }
void GasPumpGEDraw::extendByLength( double length ) { AcGeVector3d v = m_endPt - m_startPt; v.normalize(); m_endPt = m_endPt + v * length; // 更新末点坐标 update(); }
void DoubleTunnelDraw::caclEndPoint( AcGePoint3d& endPt1, AcGePoint3d& endPt2 ) { AcGeVector3d v = m_endPt - m_startPt; v.normalize(); v.rotateBy( PI * 0.5, AcGeVector3d::kZAxis ); endPt1 = m_endPt + v * m_width * 0.5; v.rotateBy( PI, AcGeVector3d::kZAxis ); endPt2 = m_endPt + v * m_width * 0.5; }
void GasPumpGEDraw::readPropertyDataFromGE( const AcStringArray& values ) { CString strLenth; strLenth.Format(_T("%s"),values[0].kACharPtr()); m_radius = _tstof(strLenth); if( 0 >= m_radius ) m_radius = 3; AcGeVector3d v = m_endPt - m_startPt; v.normalize(); m_endPt = m_startPt + v * m_radius; }
void DoubleLine::caclEndPoint( AcGePoint3d& endPt1, AcGePoint3d& endPt2 ) { AcGeVector3d v = m_ept - m_spt; v.normalize(); v.rotateBy( PI * 0.5, AcGeVector3d::kZAxis ); endPt1 = m_ept + v * m_width * 0.5; v.rotateBy( PI, AcGeVector3d::kZAxis ); endPt2 = m_ept + v * m_width * 0.5; }
// This function uses the AcEdJig mechanism to create and // drag an ellipse entity. The creation criteria are // slightly different from the AutoCAD command. In this // case, the user selects an ellipse center point and then, // drags to visually select the major and minor axes // lengths. This sample is somewhat limited; if the // minor axis ends up longer than the major axis, then the // ellipse will just be round because the radius ratio // cannot be greater than 1.0. // void createEllipse() { // First, have the user select the ellipse center point. // We don't use the jig for this because there is // nothing to see yet. // AcGePoint3d tempPt; struct resbuf rbFrom, rbTo; acedGetPoint(NULL, _T("\nEllipse center point: "), asDblArray(tempPt)); // The point we just got is in UCS coordinates, but // AcDbEllipse works in WCS, so convert the point. // rbFrom.restype = RTSHORT; rbFrom.resval.rint = 1; // from UCS rbTo.restype = RTSHORT; rbTo.resval.rint = 0; // to WCS acedTrans(asDblArray(tempPt), &rbFrom, &rbTo, Adesk::kFalse, asDblArray(tempPt)); // Now you need to get the current UCS z-Axis to be used // as the normal vector for the ellipse. // AcGeVector3d x = acdbHostApplicationServices()->workingDatabase() ->ucsxdir(); AcGeVector3d y = acdbHostApplicationServices()->workingDatabase() ->ucsydir(); AcGeVector3d normalVec = x.crossProduct(y); normalVec.normalize(); // Create an AsdkEllipseJig object passing in the // center point just selected by the user and the normal // vector just calculated. // AsdkEllipseJig *pJig = new AsdkEllipseJig(tempPt, normalVec); // Now start up the jig to interactively get the major // and minor axes lengths. // pJig->doIt(); // Now delete the jig object, since it is no longer needed. // delete pJig; }
Adesk::Boolean GasPumpGEDraw::subWorldDraw( AcGiWorldDraw* mode ) { assertReadEnabled () ; AcGeVector3d v = m_endPt - m_startPt; v.normalize(); // 绘制箭头 DrawArrow( mode, m_startPt - v * 0.5 * m_radius, m_angle, 2*0.8660254037844386 * m_radius, 1.5 * m_radius * 0.9 ); DrawCircle( mode, m_startPt, m_radius, false ); AcGePoint3d spt,ept; spt = m_startPt - v * 0.5 * m_radius + v * 1.5 * m_radius * 0.9; ept = m_startPt - v * 0.5 * m_radius + v * 1.5 * m_radius; DrawArrow( mode, spt, m_angle, 2*0.8660254037844386 * m_radius * 0.09, 1.5 * m_radius * 0.1 ); update(); return Adesk::kTrue; }
void SimpleChimneyDraw::drawSegment( AcGiWorldDraw* mode, const AcGePoint3d& spt, const AcGePoint3d& ept ) { AcGeVector3d v = ept - spt; int n = ( int )( ( v.length() + m_space ) / ( m_length + m_space ) ); //acutPrintf(_T("\n可绘制的个数:%d"), n); v.normalize(); AcGePoint3d pt = spt; for( int i = 0; i < n; i++ ) { DrawSegment( mode, pt, v, m_length, m_width, m_lineWidth ); pt = pt + v * ( m_length + m_space ); } double ll = ( ept - pt ).length(); if( ll > m_length * 0.5 ) // 如果有长度的50%,则绘制一小段 { DrawSegment( mode, pt, v, ll, m_width, m_lineWidth ); } }
// 闭合多边形向内偏移 bool OffSetPolygon( const AcGePoint3dArray& polygon, double offset, bool is_inner, AcGePoint3dArray& offset_polygon ) { // 判断多边形方向 int dir = ClockWise( polygon ); if( dir == 0 ) return false; // 向内或向外??? int c = ( is_inner ? -1 : 1 ); // 偏移方向角度 // 1) 与多边形的方向有关(dir) // 2) 与要偏移的方向有关(is_inner) double angle = c * dir * PI * 0.5; bool ret = true; int n = polygon.length(); for( int i = 0; i < n; i++ ) { int p1 = ( n + i - 1 ) % n, p2 = i % n, p3 = ( i + 1 ) % n; // 对点进行偏移 // 计算偏移向量 AcGeVector3d v1 = polygon[p2] - polygon[p1]; v1.normalize(); v1.rotateBy( angle, AcGeVector3d::kZAxis ); AcGeVector3d v2 = polygon[p3] - polygon[p2]; v2.normalize(); v2.rotateBy( angle, AcGeVector3d::kZAxis ); // 求两个向量的夹角 double angle = v1.angleTo( v2 ); double L = abs( offset / cos( angle * 0.5 ) ); AcGeVector3d v = v1 + v2; v.normalize(); offset_polygon.append( polygon[p2] + v * L ); } return ret; }
void GasPumpGEDraw::caclBackGroundMinPolygon( AcGePoint3dArray& pts ) { AcGeVector3d v0( AcGeVector3d::kXAxis ); //AcGeCircArc3d arc( m_insertPt, v,m_radius ); v0.rotateBy( m_angle, AcGeVector3d::kZAxis ); //AcGePoint3d cnt = arc.center(); AcGePoint3d spt = m_startPt + v0*m_radius; AcGePoint3d ept = m_startPt - v0*m_radius; v0.rotateBy(3.1415926/4,AcGeVector3d::kZAxis); AcGePoint3d pt = m_startPt + v0*m_radius; AcGeCircArc3d arc( spt, pt, ept ); AcGePoint3d cnt = arc.center(); double radius = arc.radius(); AcGeVector3d v = pt - cnt; v.normalize(); DividArc( spt, ept, cnt + v * ( radius ), 90, pts ); DividArc( ept, spt, cnt - v * ( radius ), 90, pts ); }
void Additional_Class::Get_ArcMiddle( AcDbObjectId PolyLineId, AcGePoint3dArray &Middle_List,AcGePoint3dArray &CenterListInput, LINEINFO &ArcInfoRList, LINEINFO &ArcInfoAList ) { double PI=3.1415926535897932384626433832795; AcDbEntity *pEnt_Temp = NULL; Acad::ErrorStatus es = acdbOpenAcDbEntity(pEnt_Temp, PolyLineId, AcDb::kForRead); if (es != Acad::eOk) { acutPrintf(_T("\nOPEN ENTITY ERROR")); return; } if (!pEnt_Temp->isKindOf(AcDbPolyline::desc())) { acutPrintf(_T("\nENTITY NOT POLYLINE")); return; } AcDbPolyline *pPolyLine = AcDbPolyline::cast(pEnt_Temp); int num = pPolyLine->numVerts(); AcGePoint3d Start_temp_PT,End_temp_PT; AcGePoint3dArray Center_List; for (int index=0; index<num; index++) { if (pPolyLine->segType(index) == AcDbPolyline::kArc) { AcGeCircArc2d tempArc; pPolyLine->getArcSegAt(index,tempArc); AcGePoint2d CenterPoint; CenterPoint = tempArc.center(); AcGePoint3d CenterPoint3d; CenterPoint3d.set(CenterPoint.x, CenterPoint.y, 0); Center_List.append(CenterPoint3d); AcGePoint3d Start_temp_PT, End_temp_PT; Start_temp_PT.set(tempArc.startPoint().x,tempArc.startPoint().y,0); End_temp_PT.set(tempArc.endPoint().x,tempArc.endPoint().y,0); AcGeVector3d tempVec; tempVec = End_temp_PT - Start_temp_PT; double tempVec_Len = tempVec.length(); tempVec.normalize(); tempVec = tempVec*(tempVec_Len/2); AcGeVector3d CenterVec; CenterVec = Start_temp_PT - CenterPoint3d; CenterVec = CenterVec + tempVec; AcGeLine2d CenterLine2d; AcGePoint3d Middle_Pt_OnLine; Middle_Pt_OnLine = CenterPoint3d+CenterVec; AcGePoint2d middle2d; middle2d.set(Middle_Pt_OnLine.x, Middle_Pt_OnLine.y); CenterLine2d.set(CenterPoint, middle2d); int s; AcGePoint2d MiddlePT, pt2; tempArc.intersectWith(CenterLine2d, s, MiddlePT, pt2); AcGePoint3d MiddlePoint; MiddlePoint.set(MiddlePT.x,MiddlePT.y,0); Middle_List.append(MiddlePoint); double StartAngle = tempArc.startAng(); double EndAngle = tempArc.endAng(); double Angle = EndAngle-StartAngle; Angle = (180/PI)*Angle; double Radius = tempArc.radius(); CString tempStr_Angle,tempStr_Radius,sita,du,banjing; sita = "θ="; du = "°"; banjing = "R="; tempStr_Angle.Format(_T("%.1f"),Angle); tempStr_Angle = sita+tempStr_Angle+du; tempStr_Radius.Format(_T("%.1f"),Radius); tempStr_Radius = banjing + tempStr_Radius; ArcInfoRList.push_back(tempStr_Radius); ArcInfoAList.push_back(tempStr_Angle); } } CenterListInput = Center_List; }
Adesk::Boolean AsdkTextStyleSamp::worldDraw(AcGiWorldDraw* pW) { AcGePoint3d pos(4.0, 4.0, 0.0); AcGeVector3d norm(0.0, 0.0, 1.0); AcGeVector3d dir(-1.0, -0.2, 0.0); char *pStr = "This is a percent, '%%%'."; int len = strlen(pStr); AcGiTextStyle style; AcGeVector3d vec = norm; vec = vec.crossProduct(dir); dir = vec.crossProduct(norm); style.setFileName("txt.shx"); style.setBigFontFileName(""); int status; if (!((status = style.loadStyleRec()) & 1)) pStr = "Font not found."; pW->geometry().text(pos, norm, dir, pStr, len, Adesk::kFalse, style); pos.y += 2.0; style.setTrackingPercent(0.8); style.setObliquingAngle(0.5); AcGePoint2d ext = style.extents(pStr, Adesk::kFalse, strlen(pStr), Adesk::kFalse); pW->geometry().text(pos, norm, dir, pStr, len, Adesk::kFalse, style); // Draw a rectangle around the last text drawn. // First you have to create a polyline the size of the // bounding box, then you have to transform it to the // correct orientation, and then to the location of the // text. // Compute the matrix that orients the box. // AcGeMatrix3d textMat; norm.normalize(); dir.normalize(); AcGeVector3d yAxis = norm; yAxis = yAxis.crossProduct(dir); yAxis.normalize(); textMat.setCoordSystem(AcGePoint3d(0.0, 0.0, 0.0), dir, yAxis, norm); // Create the bounding box and enlarge it somewhat. // double offset = ext.y / 2.0; AcGePoint3d verts[5]; verts[0] = verts[4] = AcGePoint3d(-offset, -offset, 0.0); verts[1] = AcGePoint3d(ext.x + offset, -offset, 0.0); verts[2] = AcGePoint3d(ext.x + offset, ext.y + offset, 0.0); verts[3] = AcGePoint3d(-offset, ext.y + offset, 0.0); // Orient and then translate each point in the // bounding box. // for (int i = 0; i < 5; i++) { verts[i].transformBy(textMat); verts[i].x += pos.x; verts[i].y += pos.y; verts[i].z += pos.z; } pW->geometry().polyline(5, verts); return Adesk::kTrue; }
void GasPumpGEDraw::update() { AcGeVector3d v = m_endPt - m_startPt; v.normalize(); m_angle = v.angleTo( AcGeVector3d::kXAxis, -AcGeVector3d::kZAxis ); }