void COrientOnCrvXform::MakeNormalPlane( const ON_3dPoint origin, const ON_3dVector& normal, ON_Plane& plane ) { plane.origin = origin; ON_3dVector up( normal.x, normal.y, normal.z + 1.0 ); plane.xaxis = ON_CrossProduct( up, normal ); if( plane.xaxis.IsTiny() ) { if( normal.z < 0.0 ) { plane.xaxis = ON_3dVector( 1.0, 0.0, 0.0 ); plane.yaxis = ON_3dVector( 0.0, -1.0, 0.0 ); } else { plane.xaxis = ON_3dVector( 1.0, 0.0, 0.0 ); plane.yaxis = ON_3dVector( 0.0, 1.0, 0.0 ); } } else { plane.xaxis.Unitize(); plane.yaxis = ON_CrossProduct( normal, plane.xaxis ); plane.yaxis.Unitize(); } plane.UpdateEquation(); }
void CMeshDirDrawCallback::DrawMiddleground( CRhinoViewport& vp, CRhinoDoc& ) { int mi, mcnt, fi, fcnt, vi, vcnt; mcnt = m_mesh_list.Count(); for( mi = 0; mi < mcnt; mi++ ) { ON_Color saved_color = vp.DrawColor(); CMeshDir& md = m_mesh_list[mi]; if( m_draw_face_normals ) { fcnt = md.m_face_center.Count(); vp.SetDrawColor( m_face_normal_color ); for( fi = 0; fi < fcnt; fi++ ) { vp.DrawDirectionArrow( md.m_face_center[fi], md.m_face_normal[fi] ); } } if( m_draw_vertex_normals ) { if ( md.m_mesh->HasVertexNormals() ) { vp.SetDrawColor( m_vertex_normal_color ); vcnt = md.m_mesh->m_V.Count(); for( vi = 0; vi < vcnt; vi++ ) { vp.DrawDirectionArrow( ON_3dPoint(md.m_mesh->m_V[vi]), ON_3dVector(md.m_mesh->m_N[vi]) ); } } } vp.SetDrawColor( saved_color ); } }
////////// // Create an circle from two 2d points and a tangent at the first point. bool ON_Circle::Create( const ON_2dPoint& P, // [IN] point P const ON_2dVector& Pdir, // [IN] tangent at P const ON_2dPoint& Q // [IN] point Q ) { return Create( ON_3dPoint(P), ON_3dVector(Pdir), ON_3dPoint(Q) ); }
////////// // Create an arc from a 2d start point, 2d start direction, and 2d end point. bool ON_Arc::Create( const ON_2dPoint& P, // [IN] start point const ON_2dVector& Pdir, // [IN] arc direction at start const ON_2dPoint& Q // [IN] end point ) { return Create( ON_3dPoint(P), ON_3dVector(Pdir), ON_3dPoint(Q) ); }
ON_3dVector ON_MassProperties::CentroidCoordRadiiOfGyration() const { double Rx = 0.0; double Ry = 0.0; double Rz = 0.0; if ( m_bValidSecondMoments && m_bValidMass && m_mass > 0.0 ) { Rx = sqrt((m_ccs_yy + m_ccs_zz)/m_mass); Ry = sqrt((m_ccs_zz + m_ccs_xx)/m_mass); Rz = sqrt((m_ccs_xx + m_ccs_yy)/m_mass); } return ON_3dVector(Rx,Ry,Rz); }
void ON_Light::Default() { m_light_name.Destroy(); m_bOn = 1; m_intensity = 1.0; m_watts = 0.0; m_style = ON::camera_directional_light; m_ambient = ON_Color(0,0,0); m_diffuse = ON_Color(255,255,255); m_specular = ON_Color(255,255,255); m_direction = ON_3dVector(0.0,0.0,-1.0); m_location = ON_3dPoint(0.0,0.0,0.0); m_length = ON_3dVector(0.0,0.0,0.0); m_width = ON_3dVector(0.0,0.0,0.0); m_spot_angle = 180.0; m_spot_exponent = 0.0; m_hotspot = 1.0; m_attenuation = ON_3dVector(1.0,0.0,0.0); m_shadow_intensity = 1.0; m_light_index = 0; memset(&m_light_id,0,sizeof(m_light_id)); }
ON_3dVector ON_MassProperties::CentroidCoordMomentsOfInertia() const { double Ix = 0.0; double Iy = 0.0; double Iz = 0.0; double Ix_err = 0.0; double Iy_err = 0.0; double Iz_err = 0.0; if ( m_bValidSecondMoments ) { Ix = (m_ccs_yy + m_ccs_zz); Ix_err = (m_ccs_yy_err + m_ccs_zz_err); Iy = (m_ccs_zz + m_ccs_xx); Iy_err = (m_ccs_zz_err + m_ccs_xx_err); Iz = (m_ccs_xx + m_ccs_yy); Iz_err = (m_ccs_xx_err + m_ccs_yy_err); } return ON_3dVector(Ix,Iy,Iz); }
static ON_SumSurface* ON_BrepExtrudeHelper_MakeSumSrf( const ON_Curve& path_curve, const ON_BrepEdge& base_edge, ON_BOOL32 bRev ) { ON_SumSurface* sum_srf = 0; // create side surface if ( base_edge.ProxyCurve() ) { ON_Curve* srf_path_curve = path_curve.DuplicateCurve(); ON_Curve* srf_base_curve = base_edge.DuplicateCurve(); if ( !bRev ) srf_base_curve->Reverse(); ON_3dPoint sum_basepoint = -ON_3dVector(srf_path_curve->PointAtStart()); sum_srf = new ON_SumSurface(); sum_srf->m_curve[0] = srf_base_curve; sum_srf->m_curve[1] = srf_path_curve; sum_srf->m_basepoint = sum_basepoint; sum_srf->BoundingBox(); // fills in sum_srf->m_bbox } return sum_srf; }
RH_C_FUNCTION void ON_PointCloud_InsertPoints( ON_PointCloud* pPointCloud, int index, int count, /*ARRAY*/const ON_3dPoint* points) { if( pPointCloud && points && (index >= 0) && (index <= pPointCloud->m_P.Count()) && (count > 0) ) { if( index == pPointCloud->m_P.Count() ) { ON_PointCloud_AppendPoints(pPointCloud, count, points); return; } int oldcount = pPointCloud->m_P.Count(); int newcount = oldcount + count; pPointCloud->m_P.Reserve(newcount); ON_PointCloud_FixPointCloud(pPointCloud, false, false, false); pPointCloud->m_P.SetCount(newcount); ON_3dPoint* pPoints = pPointCloud->m_P.Array(); const ON_3dPoint* pSource = pPoints + index; ON_3dPoint* pDest = pPoints + oldcount; ::memcpy(pDest, pSource, (oldcount-index)*sizeof(ON_3dPoint)); bool insertNormals = (pPointCloud->m_N.Count() > 0); bool insertColors = (pPointCloud->m_C.Count() > 0); bool insertHiddenFlags = (pPointCloud->m_H.Count() > 0); for( int i = 0; i < count; i++ ) { pPointCloud->m_P[index+i] = points[i]; if( insertNormals ) pPointCloud->m_N.Insert(index + i, ON_3dVector(0,0,0)); if( insertColors ) pPointCloud->m_C.Insert(index + i, ON_Color(0,0,0)); if( insertHiddenFlags ) pPointCloud->m_H.Insert(index + i, false); } ON_PointCloud_FixPointCloud(pPointCloud, false, false, false); pPointCloud->InvalidateBoundingBox(); } }
bool ON_Mesh::CollapseEdge( int topei ) { ON_Mesh& mesh = *this; ON__MESHEDGE me; memset(&me,0,sizeof(me)); const ON_MeshTopology& top = mesh.Topology(); const int F_count = mesh.m_F.Count(); const int V_count = mesh.m_V.Count(); const int topv_count = top.m_topv.Count(); //const int tope_count = top.m_tope.Count(); if ( topei < 0 || topei >= top.m_tope.Count() ) { return false; } const ON_MeshTopologyEdge& tope = top.m_tope[topei]; if ( tope.m_topf_count < 1 || tope.m_topvi[0] == tope.m_topvi[1] || tope.m_topvi[0] < 0 || tope.m_topvi[1] < 0 || tope.m_topvi[0] >= topv_count || tope.m_topvi[1] >= topv_count ) { return false; } const ON_MeshTopologyVertex& topv0 = top.m_topv[tope.m_topvi[0]]; const ON_MeshTopologyVertex& topv1 = top.m_topv[tope.m_topvi[1]]; if ( topv0.m_v_count < 1 || topv1.m_v_count < 1 ) { return false; } if ( topv0.m_vi[0] < 0 || topv0.m_vi[0] >= V_count ) { return false; } if ( topv1.m_vi[0] < 0 || topv1.m_vi[0] >= V_count ) { return false; } // create a ON__MESHEDGE for each face (usually one or two) that uses the edge ON__MESHEDGE* me_list = (ON__MESHEDGE*)alloca(tope.m_topf_count*sizeof(me_list[0])); int me_list_count = 0; int efi; for ( efi = 0; efi < tope.m_topf_count; efi++ ) { int fi = tope.m_topfi[efi]; if ( fi < 0 || fi >= F_count ) continue; const ON_MeshFace& f = mesh.m_F[fi]; if ( !f.IsValid(V_count) ) continue; me.vi1 = f.vi[3]; me.topvi1 = top.m_topv_map[me.vi1]; int fvi; for ( fvi = 0; fvi < 4; fvi++ ) { me.vi0 = me.vi1; me.topvi0 = me.topvi1; me.vi1 = f.vi[fvi]; me.topvi1 = top.m_topv_map[me.vi1]; if ( me.vi0 != me.vi1 ) { if ( (me.topvi0 == tope.m_topvi[0] && me.topvi1 == tope.m_topvi[1]) || (me.topvi0 == tope.m_topvi[1] && me.topvi1 == tope.m_topvi[0]) ) { if ( me.vi0 > me.vi1 ) { int i = me.vi0; me.vi0 = me.vi1; me.vi1 = i; i = me.topvi0; me.topvi0 = me.topvi1; me.topvi1 = i; } me_list[me_list_count++] = me; break; } } } } if (me_list_count<1) { return false; } // Sort me_list[] so edges using same vertices are adjacent // to each other in the list. This is needed so that non-manifold // crease edges will be properly collapsed. ON_qsort(me_list,me_list_count,sizeof(me_list[0]),(QSORTCMPFUNC)CompareMESHEDGE); // create new vertex or vertices that edge will be // collapsed to. mesh.m_C.Destroy(); mesh.m_K.Destroy(); int mei; bool bHasVertexNormals = mesh.HasVertexNormals(); bool bHasTextureCoordinates = mesh.HasTextureCoordinates(); bool bHasFaceNormals = mesh.HasFaceNormals(); if ( topv0.m_v_count == 1 || topv1.m_v_count == 1 ) { // a single new vertex ON_Line Vline(ON_origin,ON_origin); ON_Line Tline(ON_origin,ON_origin); ON_3dVector N0(0,0,0); ON_3dVector N1(0,0,0); ON_3dPoint P; int vi, tvi, cnt; int newvi = topv0.m_vi[0]; cnt = 0; for ( tvi = 0; tvi < topv0.m_v_count; tvi++ ) { vi = topv0.m_vi[tvi]; if ( vi < 0 || vi > V_count ) continue; if ( vi < newvi ) newvi = vi; cnt++; P = mesh.m_V[vi]; Vline.from += P; if ( bHasVertexNormals ) { N0 += ON_3dVector(mesh.m_N[vi]); } if ( bHasTextureCoordinates ) { P = mesh.m_T[vi]; Tline.from += P; } } if (cnt > 1) { double s = 1.0/((double)cnt); Vline.from.x *= s; Vline.from.y *= s; Vline.from.z *= s; Tline.from.x *= s; Tline.from.y *= s; Tline.from.z *= s; N0 = s*N0; } cnt = 0; for ( tvi = 0; tvi < topv1.m_v_count; tvi++ ) { vi = topv1.m_vi[tvi]; if ( vi < 0 || vi > V_count ) continue; if ( vi < newvi ) newvi = vi; cnt++; P = mesh.m_V[vi]; Vline.to += P; if ( bHasVertexNormals ) { N1 += ON_3dVector(mesh.m_N[vi]); } if ( bHasTextureCoordinates ) { P = mesh.m_T[vi]; Tline.to += P; } } if (cnt > 1) { double s = 1.0/((double)cnt); Vline.to.x *= s; Vline.to.y *= s; Vline.to.z *= s; Tline.to.x *= s; Tline.to.y *= s; Tline.to.z *= s; N1 = s*N1; } ON_3fPoint newV(Vline.PointAt(0.5)); ON_3fVector newN; ON_2fPoint newT; if ( bHasVertexNormals ) { N0.Unitize(); N1.Unitize(); ON_3dVector N = N0+N1; if ( !N.Unitize() ) { N = (topv0.m_v_count == 1) ? mesh.m_N[topv0.m_vi[0]] :mesh.m_N[topv1.m_vi[0]]; } newN = N; } if ( bHasTextureCoordinates ) { newT = Tline.PointAt(0.5); } for ( mei = 0; mei < me_list_count; mei++ ) { me_list[mei].newvi = newvi; me_list[mei].newV = newV; me_list[mei].newN = newN; me_list[mei].newT = newT; } } else { // collapsing a "crease" edge - attempt to preserve // the crease. memset(&me,0,sizeof(me)); me.vi0 = -1; me.vi1 = -1; for ( mei = 0; mei < me_list_count; mei++ ) { if ( 0 == mei && CompareMESHEDGE(&me,me_list+mei) ) { // cook up new vertex me_list[mei].newvi = mesh.m_V.Count(); me = me_list[mei]; ON_Line line; line.from = mesh.m_V[me.vi0]; line.to = mesh.m_V[me.vi1]; me.newV = line.PointAt(0.5); if ( bHasVertexNormals ) { ON_3dVector N0(mesh.m_N[me.vi0]); ON_3dVector N1(mesh.m_N[me.vi1]); ON_3dVector N = N0 + N1; if ( !N.Unitize() ) N = N0; me.newN = N; } if ( bHasTextureCoordinates ) { line.from = mesh.m_T[me.vi0]; line.to = mesh.m_T[me.vi1]; me.newT = line.PointAt(0.5); } me.newvi = (me.vi0 < me.vi1) ? me.vi0 : me.vi1; } else { me_list[mei].newvi = me.newvi; me_list[mei].newV = me.newV; me_list[mei].newN = me.newN; me_list[mei].newT = me.newT; } } } // We are done averaging old mesh values. // Change values in mesh m_V[], m_N[] and m_T[] arrays. for ( mei = 0; mei < me_list_count; mei++ ) { mesh.m_V[me_list[mei].vi0] = me_list[mei].newV; mesh.m_V[me_list[mei].vi1] = me_list[mei].newV; if ( bHasVertexNormals ) { mesh.m_N[me_list[mei].vi0] = me_list[mei].newN; mesh.m_N[me_list[mei].vi1] = me_list[mei].newN; } if ( bHasTextureCoordinates ) { mesh.m_T[me_list[mei].vi0] = me_list[mei].newT; mesh.m_T[me_list[mei].vi1] = me_list[mei].newT; } } // make a map of old to new int old2new_map_count = 0; ON__NEWVI* old2new_map = (ON__NEWVI*)alloca(2*me_list_count*sizeof(old2new_map[0])); for ( mei = 0; mei < me_list_count; mei++ ) { old2new_map[old2new_map_count].oldvi = me_list[mei].vi0; old2new_map[old2new_map_count].newvi = me_list[mei].newvi; old2new_map_count++; old2new_map[old2new_map_count].oldvi = me_list[mei].vi1; old2new_map[old2new_map_count].newvi = me_list[mei].newvi; old2new_map_count++; } // sort old2new_map[] so we can use a fast bsearch() call // to update faces. ON_qsort(old2new_map,old2new_map_count,sizeof(old2new_map[0]),(QSORTCMPFUNC)CompareNEWVI); // count faces that use the vertices that are being changed int bad_fi_count = 0; int topv_end, vei, fi, fvi23, fvi; ON__NEWVI nvi; for ( topv_end = 0; topv_end < 2; topv_end++ ) { const ON_MeshTopologyVertex& topv = (topv_end) ? topv1 : topv0; for ( vei = 0; vei < topv.m_tope_count; vei++ ) { topei = topv.m_topei[vei]; if ( topei < 0 && topei >= top.m_tope.Count() ) continue; bad_fi_count += top.m_tope[topei].m_topf_count; } } int* bad_fi = (int*)alloca(bad_fi_count*sizeof(*bad_fi)); bad_fi_count = 0; // Go through all the faces that use the vertices at the // ends of the edge and update the vi[] values to use the // new vertices. for ( topv_end = 0; topv_end < 2; topv_end++ ) { const ON_MeshTopologyVertex& topv = (topv_end) ? topv1 : topv0; for ( vei = 0; vei < topv.m_tope_count; vei++ ) { topei = topv.m_topei[vei]; if ( topei < 0 && topei >= top.m_tope.Count() ) continue; const ON_MeshTopologyEdge& e = top.m_tope[topei]; for ( efi = 0; efi < e.m_topf_count; efi++ ) { fi = e.m_topfi[efi]; if ( fi < 0 || fi >= F_count ) continue; bool bChangedFace = false; ON_MeshFace& f = mesh.m_F[fi]; for ( fvi = 0; fvi < 4; fvi++ ) { nvi.oldvi = f.vi[fvi]; ON__NEWVI* p = (ON__NEWVI*)bsearch(&nvi,old2new_map,old2new_map_count,sizeof(old2new_map[0]),(QSORTCMPFUNC)CompareNEWVI); if ( 0 != p && p->oldvi != p->newvi) { f.vi[fvi] = p->newvi; bChangedFace = true; } } if ( bChangedFace ) { if ( !f.IsValid(V_count) ) { if ( f.vi[3] == f.vi[0] ) { f.vi[0] = f.vi[1]; f.vi[1] = f.vi[2]; f.vi[2] = f.vi[3]; } else if ( f.vi[0] == f.vi[1] ) { fvi23 = f.vi[0]; f.vi[0] = f.vi[2]; f.vi[1] = f.vi[3]; f.vi[2] = fvi23; f.vi[3] = fvi23; } else if ( f.vi[1] == f.vi[2] ) { fvi23 = f.vi[1]; f.vi[1] = f.vi[0]; f.vi[0] = f.vi[3]; f.vi[2] = fvi23; f.vi[3] = fvi23; } if ( f.vi[0] == f.vi[1] || f.vi[1] == f.vi[2] || f.vi[2] == f.vi[0] || f.vi[2] != f.vi[3] ) { bad_fi[bad_fi_count++] = fi; } } if ( bHasFaceNormals ) { // invalid faces are removed below ON_3fVector a, b, n; a = mesh.m_V[f.vi[2]] - mesh.m_V[f.vi[0]]; b = mesh.m_V[f.vi[3]] - mesh.m_V[f.vi[1]]; n = ON_CrossProduct( a, b ); n.Unitize(); mesh.m_FN[fi] = n; } } } } } if ( bad_fi_count > 0 ) { // remove collapsed faces ON_qsort(bad_fi,bad_fi_count,sizeof(bad_fi[0]),CompareInt); int bfi = 1; int dest_fi = bad_fi[0]; for ( fi = dest_fi+1; fi < F_count && bfi < bad_fi_count; fi++ ) { if ( fi == bad_fi[bfi] ) { bfi++; } else { mesh.m_F[dest_fi++] = mesh.m_F[fi]; } } while (fi<F_count) { mesh.m_F[dest_fi++] = mesh.m_F[fi++]; } mesh.m_F.SetCount(dest_fi); if ( bHasFaceNormals ) { bfi = 1; dest_fi = bad_fi[0]; for ( fi = dest_fi+1; fi < F_count && bfi < bad_fi_count; fi++ ) { if ( fi == bad_fi[bfi] ) { bfi++; } else { mesh.m_FN[dest_fi++] = mesh.m_FN[fi]; } } while (fi<F_count) { mesh.m_FN[dest_fi++] = mesh.m_FN[fi++]; } mesh.m_FN.SetCount(dest_fi); } } mesh.Compact(); mesh.DestroyTopology(); mesh.DestroyPartition(); return true; }
CRhinoCommand::result CGenCylinder::RunCommand( const CRhinoCommandContext& context ) { Cscript1PlugIn& plugin = script1PlugIn(); if( !plugin.IsDlgVisible() ) { return CRhinoCommand::nothing; } /*****************************************/ /*CHECKING IF THERE IS ALREADY A CYLINDER*/ /*****************************************/ const CRhinoLayer& layer = context.m_doc.m_layer_table.CurrentLayer(); ON_SimpleArray<CRhinoObject*> objects; int object_count = context.m_doc.LookupObject( layer, objects ); const CRhinoBrepObject* brep_obj; const CRhinoCurveObject* curve_obj; const CRhinoSurfaceObject* surface_obj; int surf_count=0; if( object_count > 0 ) { int brep_obj_count = 0; int polycurve_count = 0; const CRhinoObject* object = 0; for(int i = 0; i < object_count; i++ ) { object = objects[ i ]; /************************************/ /*TRY CASTING AS A RHINO BREP OBJECT*/ /************************************/ brep_obj = CRhinoBrepObject::Cast( object ); if( brep_obj && object->IsSolid()) { brep_obj_count++; } /*******************************/ /*TRY CASTING AS A CURVE OBJECT*/ /*******************************/ curve_obj = CRhinoCurveObject::Cast( object ); if( curve_obj ) { polycurve_count++; } //surface_obj = CRhinoSurfaceObject::Cast( object ); // if( surface_obj ) // { //surf_count++; // } } if( brep_obj_count == 0) { ON_3dPoint center_point( 0.0, 0.0, 0.0 ); double radius = 63.5; int __count = plugin.m_dialog->m_comboAltTacco.GetCount(); int nIndex = plugin.m_dialog->m_comboAltTacco.GetCurSel(); CString strCBText; plugin.m_dialog->m_comboAltTacco.GetLBText( nIndex, strCBText); int height = _wtoi(strCBText); ON_3dPoint height_point( 0.0, 0.0, height); ON_3dVector zaxis = height_point - center_point; ON_Plane planeCir( center_point, zaxis ); /*ADD CIRCLE FOR CYLINDER'S BASE*/ ON_Circle circle( planeCir, radius ); /*ADD CYLINDER*/ ON_Cylinder cylinder( circle, zaxis.Length() ); ON_Brep* brep = ON_BrepCylinder( cylinder, TRUE, TRUE ); unsigned int first_SN; unsigned int next_SN; if( brep ) { first_SN = CRhinoObject::NextRuntimeObjectSerialNumber(); /********************/ /*TRANSLATE CYLINDER*/ /********************/ int nIndex1 = plugin.m_dialog->AltezzaFondelloControllo.GetCurSel(); CString strCBText1; plugin.m_dialog->AltezzaFondelloControllo.GetLBText( nIndex1, strCBText1); int altfondello = _wtoi(strCBText1); ON_wString obj_nameCyl = L"CILINDRO"; brep->Translate(ON_3dVector( 0.0, 0.0, -altfondello)); CRhinoBrepObject* cylinder_object = new CRhinoBrepObject(); cylinder_object->SetBrep( brep ); if( context.m_doc.AddObject(cylinder_object) ) { context.m_doc.Redraw(); next_SN = CRhinoObject::NextRuntimeObjectSerialNumber(); if( first_SN == next_SN ) { return CRhinoCommand::nothing; } else { SetNametoObject(context.m_doc,first_SN,obj_nameCyl,true); } } else { delete cylinder_object; } /*********************************************/ /* DA SISTEMARE */ /*********************************************/ CRhinoSnapContext snap; bool dec1 = snap.SnapToPoint(ON_3dPoint(63.5, 0.0, (height - altfondello))); bool dec2 = snap.SnapToPoint(ON_3dPoint(63.5, 0.0, -altfondello)); bool dec3 = snap.SnapToPoint(ON_3dPoint(63.5, 0.0, 0.0)); if(dec1 && dec2) { CRhinoLinearDimension* dim_obj = new CRhinoLinearDimension(); ON_Plane plane( ON_zx_plane ); plane.SetOrigin( ON_3dPoint(63.5, 0.0, 0.0) ); dim_obj->SetPlane( plane ); ON_3dPoint pt_1(63.5, 0.0, (height - altfondello)); ON_3dPoint pt_2(63.5, 0.0, -altfondello); double u, v; plane.ClosestPointTo( pt_1, &u, &v ); dim_obj->SetPoint( 0, ON_2dPoint(u, v) ); dim_obj->SetPoint( 1, ON_2dPoint(u, (v + height/2)) ); plane.ClosestPointTo( pt_2, &u, &v ); dim_obj->SetPoint( 2, ON_2dPoint(u, v) ); dim_obj->SetPoint( 3, ON_2dPoint(u, (v + height/2)) ); dim_obj->UpdateText(); if( context.m_doc.AddObject(dim_obj) ) { context.m_doc.Redraw(); } else { delete dim_obj; } } /*********************************************/ /* DA SISTEMARE */ /*********************************************/ if(dec2 && dec3) { CRhinoLinearDimension* dim_obj = new CRhinoLinearDimension(); ON_Plane plane( ON_zx_plane ); plane.SetOrigin( ON_3dPoint(63.5, 0.0, 0.0) ); dim_obj->SetPlane( plane ); ON_3dPoint pt_1(63.5, 0.0, 0.0); ON_3dPoint pt_2(63.5, 0.0, -altfondello); double u, v; plane.ClosestPointTo( pt_1, &u, &v ); dim_obj->SetPoint( 0, ON_2dPoint(u, v) ); dim_obj->SetPoint( 1, ON_2dPoint(u, (v + height/2)) ); plane.ClosestPointTo( pt_2, &u, &v ); dim_obj->SetPoint( 2, ON_2dPoint(u, v) ); dim_obj->SetPoint( 3, ON_2dPoint(u, (v + height/2)) ); dim_obj->UpdateText(); if( context.m_doc.AddObject(dim_obj) ) { context.m_doc.Redraw(); } else { delete dim_obj; } } /*********************************************/ /* DA SISTEMARE By Nello */ /*********************************************/ ON_3dPoint provapunto2 = AltezzaTacco; ON_3dPoint provapunto(59.5,0,provapunto2.z); provapunto.z-=0.7; ON_3dPoint pt_1(59.5, 0.0, (height - altfondello)); CRhinoLinearDimension* dim_obj = new CRhinoLinearDimension(); ON_Plane plane( ON_zx_plane ); plane.SetOrigin(pt_1); dim_obj->SetPlane( plane ); //ON_3dPoint pt_1(63.5, 0.0, 0.0); ON_3dPoint pt_2 = provapunto; double u, v; plane.ClosestPointTo( pt_1, &u, &v ); dim_obj->SetPoint( 0, ON_2dPoint(u, v) ); dim_obj->SetPoint( 1, ON_2dPoint(u, (v + height/2)) ); plane.ClosestPointTo( pt_2, &u, &v ); dim_obj->SetPoint( 2, ON_2dPoint(u, v) ); dim_obj->SetPoint( 3, ON_2dPoint(u, (v + height/2)) ); dim_obj->UpdateText(); if( context.m_doc.AddObject(dim_obj) ) { context.m_doc.Redraw(); } else { delete dim_obj; } /*INIZIO FUNZIONE CONTROLLO*/ if ( (height - altfondello)>=provapunto.z+10){ ::RhinoApp().Print( L"Funzione controllo altezza OK"); } else{ ::RhinoApp().Print( L"Funzione controllo altezza NOK: CONTROLLARE!! Il valore della testa e' minore del valore minimo di 10 mm. Occorre diminuire l'altezza del fondello o aumentare l'altezza dello stampo."); } /*********************************************/ /* CREATE FONDELLO PLANE */ /*********************************************/ ON_3dPoint point0((63.5 + 20.0),0.0, 0.0); ON_3dPoint point1(-(63.5 + 20.0),0.0, 0.0); ON_LineCurve curve0( point0, point1 ); context.m_doc.AddCurveObject(curve0); context.m_doc.Redraw(); /******************************************************/ /*****************************/ /*USER GIVES NAME TO SURFACES*/ /*****************************/ unsigned int first_sn; unsigned int next_sn; ON_wString obj_name; object_count = context.m_doc.LookupObject( layer, objects ); for(int i = 0; i < object_count; i++ ) { object = objects[ i ]; first_sn = CRhinoObject::NextRuntimeObjectSerialNumber(); /*******************************/ /*TRY CASTING AS A CURVE OBJECT*/ /*******************************/ curve_obj = CRhinoCurveObject::Cast( object ); if( curve_obj ) { const ON_Geometry* geo = curve_obj->Geometry(); const ON_Curve* curve00 = ON_Curve::Cast(geo); ON_3dPoint point = curve00->PointAt(0.0); ON_3dPoint point_ = curve00->PointAt(1.0); if((point.z + point_.z)/2 > 0.0) { obj_name = L"SURFPV"; } else { obj_name = L"SURFFO"; } ON_3dPoint point0(point.x, (point.y + 70.0), point.z); ON_3dPoint point1(point.x, (point.y - 70.0), point.z); ON_LineCurve* curve = new ON_LineCurve(); curve->SetStartPoint(point0); curve->SetEndPoint(point1); ON_SumSurface sumSurf0; sumSurf0.Create(*curve, *curve00); if( context.m_doc.AddSurfaceObject(sumSurf0) ) { context.m_doc.Redraw(); next_sn = CRhinoObject::NextRuntimeObjectSerialNumber(); if( first_sn == next_sn ) { return CRhinoCommand::nothing; } else { SetNametoObject(context.m_doc,first_sn,obj_name,true); } } } }/*CLOSED FOR*/ //int R = 0; //object_count = context.m_doc.LookupObject( layer, objects ); //for(int i = 0; i < object_count; i++) //{ // object = objects[ i ]; // const CRhinoCurveObject* surface_obj = CRhinoCurveObject::Cast(object); // if(surface_obj) // { // R++; // } //} // // Get the string entered by the user // ON_wString obj_name = gs.String(); // obj_name.TrimLeftAndRight(); // // // Is name the same? // if( obj_name.Compare(obj_attribs.m_name) == 0 ) //return CRhinoCommand::nothing; // // // Modify the attributes of the object // obj_attribs.m_name = obj_name; // context.m_doc.ModifyObjectAttributes( objref, obj_attribs ); // if(selectobjectbyuuid_s(context.m_doc,obj_Surf[j],false)) // { //int R = 0; // } ON_wString obj_Surf[2]; ON_wString name; obj_Surf[0] = L"SURFPV"; obj_Surf[1] = L"SURFFO"; object_count = context.m_doc.LookupObject( layer, objects ); int R = 0; /************************/ /*TRY SPLITTING THE BREP*/ /************************/ for(int j = 0; j < 2; j++) { for(int i = 0; i < object_count; i++) { object = objects[ i ]; /*MAKE COPY OF OBJECT ATTRIBUTES. THIS OBJECTS*/ /*HOLDS AN OBJECT'S USER-DEFINED NAME.*/ ON_3dmObjectAttributes obj_attribs = object->Attributes(); name = object->Attributes().m_name; surface_obj = CRhinoSurfaceObject::Cast( object ); if( surface_obj && !surface_obj->IsSolid()) { ON_wString obj_SurfLoc = obj_Surf[j]; /*IS THE CUTTING SURFACE?*/ if( obj_SurfLoc.Compare(name) == 0 ) { R++; } }/*CHIUSURA IF SUPERFICIE*/ } // /************************/ // /*PICK THE BREP TO SPLIT*/ // /************************/ // CRhinoGetObject go; // go.SetCommandPrompt( L"SELECT SOLID TO SPLIT" ); // go.SetGeometryFilter( CRhinoGetObject::polysrf_object );//CRhinoGetObject::surface_object | CRhinoGetObject::polysrf_object // go.GetObjects( 1, 1 ); // if( go.CommandResult() != success ) // { //return go.CommandResult(); // } // else // { // RhinoMessageBox(L"CYLINDER IS SELECTED", PlugIn()->PlugInName(), MB_OK | MB_ICONEXCLAMATION ); // } // // const CRhinoObjRef& split_ref = go.Object(0); // // const CRhinoObject* split_object = split_ref.Object(); // if( !split_object ) // { //return failure; // } // // const ON_Brep* split = split_ref.Brep(); // if( !split ) // { //return failure; // } // ON_SimpleArray<ON_Brep*> pieces; // double tol = context.m_doc.AbsoluteTolerance(); // /***********************/ // /*PICK THE CUTTING BREP*/ // /***********************/ // go.SetCommandPrompt( L"SELECT CUTTING SURFACE OR POLYSUFACE" ); // go.SetGeometryFilter( CRhinoGetObject::surface_object | CRhinoGetObject::polysrf_object ); // go.EnablePreSelect( FALSE ); // go.EnableDeselectAllBeforePostSelect( FALSE ); // go.GetObjects( 1, 2 ); // if( go.CommandResult() != success ) // { //return go.CommandResult(); // } // const ON_Brep* cutter = go.Object(0).Brep(); // if( !cutter ) // { //return failure; // } // // if( !RhinoBrepSplit(*split, *cutter, tol, pieces) ) // { //RhinoApp().Print( L"UNABLE TO SPLIT BREP.\n" ); // } // // int i, count = pieces.Count(); // if( count == 0 | count == 1 ) // { //if( count == 1 ) //{ // delete pieces[0]; //} //return nothing; // } // // CRhinoObjectAttributes attrib = split_object->Attributes(); // attrib.m_uuid = ON_nil_uuid; // // const CRhinoObjectVisualAnalysisMode* vam_list = split_object->m_analysis_mode_list; // // for( i = 0; i < count; i++ ) // { //CRhinoBrepObject* brep_object = new CRhinoBrepObject( attrib ); //if( brep_object ) //{ // brep_object->SetBrep( pieces[i] ); // if( context.m_doc.AddObject(brep_object) ) // { // RhinoCopyAnalysisModes( vam_list, brep_object ); // } // else // { // delete brep_object; // } //} // } // // context.m_doc.DeleteObject( split_ref ); // context.m_doc.Redraw(); } /*CREATE A NEW LAYER*/ ON_Layer layer; int layer_index = 0; ON_Color color = ON_Color(0, 0, 0); ON_wString layer_name_FONDELLO = L"FONDELLO"; layer.SetLayerName( layer_name_FONDELLO ); layer.SetPlotColor(color.Green()); /*ADD THE LAYER TO THE LAYER TABLE*/ layer_index = context.m_doc.m_layer_table.AddLayer( layer ); ON_wString layer_name_MATRICE = L"MATRICE"; layer.SetLayerName( layer_name_MATRICE ); layer.SetColor(color.Red()); /*ADD THE LAYER TO THE LAYER TABLE*/ layer_index = context.m_doc.m_layer_table.AddLayer( layer ); ON_wString layer_name_FISSO = L"FISSO"; layer.SetLayerName( layer_name_FISSO ); layer.SetColor(color.Blue()); /*ADD THE LAYER TO THE LAYER TABLE*/ layer_index = context.m_doc.m_layer_table.AddLayer( layer ); context.m_doc.Redraw(); /*********************************************************/ } }/*CLOSED IF OVER CHECKING BREP COUNT OBJECT*/ else { RhinoMessageBox(L"THERE IS ALREADY A CYLINDER OBJECT", PlugIn()->PlugInName(), MB_OK | MB_ICONEXCLAMATION ); } } /**********************************************************************/ return CRhinoCommand::success; }
extern "C" void rt_revolve_brep(ON_Brep **b, const struct rt_db_internal *ip, const struct bn_tol *tol) { struct rt_db_internal *tmp_internal; struct rt_revolve_internal *rip; struct rt_sketch_internal *eip; BU_ALLOC(tmp_internal, struct rt_db_internal); RT_DB_INTERNAL_INIT(tmp_internal); rip = (struct rt_revolve_internal *)ip->idb_ptr; RT_REVOLVE_CK_MAGIC(rip); eip = rip->skt; RT_SKETCH_CK_MAGIC(eip); ON_3dPoint plane_origin; ON_3dVector plane_x_dir, plane_y_dir; bool full_revolve = true; if (rip->ang < 2*ON_PI && rip->ang > 0) full_revolve = false; // Find plane in 3 space corresponding to the sketch. vect_t startpoint; VADD2(startpoint, rip->v3d, rip->r); plane_origin = ON_3dPoint(startpoint); plane_x_dir = ON_3dVector(eip->u_vec); plane_y_dir = ON_3dVector(eip->v_vec); const ON_Plane sketch_plane = ON_Plane(plane_origin, plane_x_dir, plane_y_dir); // For the brep, need the list of 3D vertex points. In sketch, they // are stored as 2D coordinates, so use the sketch_plane to define 3 space // points for the vertices. for (size_t i = 0; i < eip->vert_count; i++) { (*b)->NewVertex(sketch_plane.PointAt(eip->verts[i][0], eip->verts[i][1]), 0.0); } // Create the brep elements corresponding to the sketch lines, curves // and bezier segments. Create 2d, 3d and BrepEdge elements for each segment. // Will need to use the bboxes of each element to // build the overall bounding box for the face. Use bGrowBox to expand // a single box. struct line_seg *lsg; struct carc_seg *csg; struct bezier_seg *bsg; uint32_t *lng; for (size_t i = 0; i < (&eip->curve)->count; i++) { lng = (uint32_t *)(&eip->curve)->segment[i]; switch (*lng) { case CURVE_LSEG_MAGIC: { lsg = (struct line_seg *)lng; ON_Curve* lsg3d = new ON_LineCurve((*b)->m_V[lsg->start].Point(), (*b)->m_V[lsg->end].Point()); lsg3d->SetDomain(0.0, 1.0); (*b)->m_C3.Append(lsg3d); } break; case CURVE_CARC_MAGIC: csg = (struct carc_seg *)lng; if (csg->radius < 0) { { ON_3dPoint cntrpt = (*b)->m_V[csg->end].Point(); ON_3dPoint edgept = (*b)->m_V[csg->start].Point(); ON_Plane cplane = ON_Plane(cntrpt, plane_x_dir, plane_y_dir); ON_Circle c3dcirc = ON_Circle(cplane, cntrpt.DistanceTo(edgept)); ON_Curve* c3d = new ON_ArcCurve((const ON_Circle)c3dcirc); c3d->SetDomain(0.0, 1.0); (*b)->m_C3.Append(c3d); } } else { // need to calculated 3rd point on arc - look to sketch.c around line 581 for // logic } break; case CURVE_BEZIER_MAGIC: bsg = (struct bezier_seg *)lng; { ON_3dPointArray bezpoints = ON_3dPointArray(bsg->degree + 1); for (int j = 0; j < bsg->degree + 1; j++) { bezpoints.Append((*b)->m_V[bsg->ctl_points[j]].Point()); } ON_BezierCurve bez3d = ON_BezierCurve((const ON_3dPointArray)bezpoints); ON_NurbsCurve* beznurb3d = ON_NurbsCurve::New(); bez3d.GetNurbForm(*beznurb3d); beznurb3d->SetDomain(0.0, 1.0); (*b)->m_C3.Append(beznurb3d); } break; default: bu_log("Unhandled sketch object\n"); break; } } vect_t endpoint; VADD2(endpoint, rip->v3d, rip->axis3d); const ON_Line& revaxis = ON_Line(ON_3dPoint(rip->v3d), ON_3dPoint(endpoint)); FindLoops(b, &revaxis, rip->ang); // Create the two boundary surfaces, if it's not a full revolution if (!full_revolve) { // First, deduce the transformation matrices to calculate the position of the end surface // The transformation matrices are to rotate an arbitrary point around an arbitrary axis // Let the point A = (x, y, z), the rotation axis is p1p2 = (x2,y2,z2)-(x1,y1,z1) = (a,b,c) // Then T1 is to translate p1 to the origin // Rx is to rotate p1p2 around the X axis to the plane XOZ // Ry is to rotate p1p2 around the Y axis to be coincident to Z axis // Rz is to rotate A with the angle around Z axis (the new p1p2) // RxInv, RyInv, T1Inv are the inverse transformation of Rx, Ry, T1, respectively. // The whole transformation is A' = A*T1*Rx*Ry*Rz*Ry*Inv*Rx*Inv = A*R vect_t end_plane_origin, end_plane_x_dir, end_plane_y_dir; mat_t R; MAT_IDN(R); mat_t T1, Rx, Ry, Rz, RxInv, RyInv, T1Inv; MAT_IDN(T1); VSET(&T1[12], -rip->v3d[0], -rip->v3d[1], -rip->v3d[2]); MAT_IDN(Rx); fastf_t v = sqrt(rip->axis3d[1]*rip->axis3d[1]+rip->axis3d[2]*rip->axis3d[2]); VSET(&Rx[4], 0, rip->axis3d[2]/v, rip->axis3d[1]/v); VSET(&Rx[8], 0, -rip->axis3d[1]/v, rip->axis3d[2]/v); MAT_IDN(Ry); fastf_t u = MAGNITUDE(rip->axis3d); VSET(&Ry[0], v/u, 0, -rip->axis3d[0]/u); VSET(&Ry[8], rip->axis3d[0]/u, 0, v/u); MAT_IDN(Rz); fastf_t C, S; C = cos(rip->ang); S = sin(rip->ang); VSET(&Rz[0], C, S, 0); VSET(&Rz[4], -S, C, 0); bn_mat_inv(RxInv, Rx); bn_mat_inv(RyInv, Ry); bn_mat_inv(T1Inv, T1); mat_t temp; bn_mat_mul4(temp, T1, Rx, Ry, Rz); bn_mat_mul4(R, temp, RyInv, RxInv, T1Inv); VEC3X3MAT(end_plane_origin, plane_origin, R); VADD2(end_plane_origin, end_plane_origin, &R[12]); VEC3X3MAT(end_plane_x_dir, plane_x_dir, R); VEC3X3MAT(end_plane_y_dir, plane_y_dir, R); // Create the start and end surface with rt_sketch_brep() struct rt_sketch_internal sketch; sketch = *(rip->skt); ON_Brep *b1 = ON_Brep::New(); VMOVE(sketch.V, plane_origin); VMOVE(sketch.u_vec, plane_x_dir); VMOVE(sketch.v_vec, plane_y_dir); tmp_internal->idb_ptr = (void *)(&sketch); rt_sketch_brep(&b1, tmp_internal, tol); (*b)->Append(*b1->Duplicate()); ON_Brep *b2 = ON_Brep::New(); VMOVE(sketch.V, end_plane_origin); VMOVE(sketch.u_vec, end_plane_x_dir); VMOVE(sketch.v_vec, end_plane_y_dir); tmp_internal->idb_ptr = (void *)(&sketch); rt_sketch_brep(&b2, tmp_internal, tol); (*b)->Append(*b2->Duplicate()); (*b)->FlipFace((*b)->m_F[(*b)->m_F.Count()-1]); } bu_free(tmp_internal, "free temporary rt_db_internal"); }
extern "C" void rt_ehy_brep(ON_Brep **b, const struct rt_db_internal *ip, const struct bn_tol *) { struct rt_ehy_internal *eip; RT_CK_DB_INTERNAL(ip); eip = (struct rt_ehy_internal *)ip->idb_ptr; RT_EHY_CK_MAGIC(eip); // Check the parameters if (!NEAR_ZERO(VDOT(eip->ehy_Au, eip->ehy_H), RT_DOT_TOL)) { bu_log("rt_ehy_brep: Au and H are not perpendicular!\n"); return; } if (!NEAR_EQUAL(MAGNITUDE(eip->ehy_Au), 1.0, RT_LEN_TOL)) { bu_log("rt_ehy_brep: Au not a unit vector!\n"); return; } if (MAGNITUDE(eip->ehy_H) < RT_LEN_TOL || eip->ehy_c < RT_LEN_TOL || eip->ehy_r1 < RT_LEN_TOL || eip->ehy_r2 < RT_LEN_TOL) { bu_log("rt_ehy_brep: not all dimensions positive!\n"); return; } if (eip->ehy_r2 > eip->ehy_r1) { bu_log("rt_ehy_brep: semi-minor axis cannot be longer than semi-major axis!\n"); return; } point_t p1_origin; ON_3dPoint plane1_origin, plane2_origin; ON_3dVector plane_x_dir, plane_y_dir; // First, find plane in 3 space corresponding to the bottom face of the EPA. vect_t x_dir, y_dir; VMOVE(x_dir, eip->ehy_Au); VCROSS(y_dir, eip->ehy_Au, eip->ehy_H); VUNITIZE(y_dir); VMOVE(p1_origin, eip->ehy_V); plane1_origin = ON_3dPoint(p1_origin); plane_x_dir = ON_3dVector(x_dir); plane_y_dir = ON_3dVector(y_dir); const ON_Plane ehy_bottom_plane(plane1_origin, plane_x_dir, plane_y_dir); // Next, create an ellipse in the plane corresponding to the edge of the ehy. ON_Ellipse ellipse1(ehy_bottom_plane, eip->ehy_r1, eip->ehy_r2); ON_NurbsCurve* ellcurve1 = ON_NurbsCurve::New(); ellipse1.GetNurbForm((*ellcurve1)); ellcurve1->SetDomain(0.0, 1.0); // Generate the bottom cap ON_SimpleArray<ON_Curve*> boundary; boundary.Append(ON_Curve::Cast(ellcurve1)); ON_PlaneSurface* bp = new ON_PlaneSurface(); bp->m_plane = ehy_bottom_plane; bp->SetDomain(0, -100.0, 100.0); bp->SetDomain(1, -100.0, 100.0); bp->SetExtents(0, bp->Domain(0)); bp->SetExtents(1, bp->Domain(1)); (*b)->m_S.Append(bp); const int bsi = (*b)->m_S.Count() - 1; ON_BrepFace& bface = (*b)->NewFace(bsi); (*b)->NewPlanarFaceLoop(bface.m_face_index, ON_BrepLoop::outer, boundary, true); const ON_BrepLoop* bloop = (*b)->m_L.Last(); bp->SetDomain(0, bloop->m_pbox.m_min.x, bloop->m_pbox.m_max.x); bp->SetDomain(1, bloop->m_pbox.m_min.y, bloop->m_pbox.m_max.y); bp->SetExtents(0, bp->Domain(0)); bp->SetExtents(1, bp->Domain(1)); (*b)->SetTrimIsoFlags(bface); delete ellcurve1; // Now, the hard part. Need an elliptical hyperbolic NURBS surface // First step is to create a nurbs curve. double intercept_calc = (eip->ehy_c)*(eip->ehy_c)/(MAGNITUDE(eip->ehy_H) + eip->ehy_c); double intercept_dist = MAGNITUDE(eip->ehy_H) + eip->ehy_c - intercept_calc; double intercept_length = intercept_dist - MAGNITUDE(eip->ehy_H); double MX = MAGNITUDE(eip->ehy_H); double MP = MX + intercept_length; double w = (MX/MP)/(1-MX/MP); point_t ep1, ep2, ep3; VSET(ep1, -eip->ehy_r1, 0, 0); VSET(ep2, 0, 0, w*intercept_dist); VSET(ep3, eip->ehy_r1, 0, 0); ON_3dPoint onp1 = ON_3dPoint(ep1); ON_3dPoint onp2 = ON_3dPoint(ep2); ON_3dPoint onp3 = ON_3dPoint(ep3); ON_3dPointArray cpts(3); cpts.Append(onp1); cpts.Append(onp2); cpts.Append(onp3); ON_BezierCurve *bcurve = new ON_BezierCurve(cpts); bcurve->MakeRational(); bcurve->SetWeight(1, w); ON_NurbsCurve* tnurbscurve = ON_NurbsCurve::New(); bcurve->GetNurbForm(*tnurbscurve); ON_NurbsCurve* hypbnurbscurve = ON_NurbsCurve::New(); const ON_Interval subinterval = ON_Interval(0, 0.5); tnurbscurve->GetNurbForm(*hypbnurbscurve, 0.0, &subinterval); // Next, rotate that curve around the height vector. point_t revpoint1, revpoint2; VSET(revpoint1, 0, 0, 0); VSET(revpoint2, 0, 0, MX); ON_3dPoint rpnt1 = ON_3dPoint(revpoint1); ON_3dPoint rpnt2 = ON_3dPoint(revpoint2); ON_Line revaxis = ON_Line(rpnt1, rpnt2); ON_RevSurface* hyp_surf = ON_RevSurface::New(); hyp_surf->m_curve = hypbnurbscurve; hyp_surf->m_axis = revaxis; hyp_surf->m_angle = ON_Interval(0, 2*ON_PI); // Get the NURBS form of the surface ON_NurbsSurface *ehycurvedsurf = ON_NurbsSurface::New(); hyp_surf->GetNurbForm(*ehycurvedsurf, 0.0); delete hyp_surf; delete tnurbscurve; delete bcurve; // Transformations for (int i = 0; i < ehycurvedsurf->CVCount(0); i++) { for (int j = 0; j < ehycurvedsurf->CVCount(1); j++) { point_t cvpt; ON_4dPoint ctrlpt; ehycurvedsurf->GetCV(i, j, ctrlpt); // Scale the control points of the // resulting surface to map to the shorter axis. VSET(cvpt, ctrlpt.x, ctrlpt.y * eip->ehy_r2/eip->ehy_r1, ctrlpt.z); // Rotate according to the directions of Au and H vect_t Hu; mat_t R; point_t new_cvpt; VSCALE(Hu, eip->ehy_H, 1/MAGNITUDE(eip->ehy_H)); MAT_IDN(R); VMOVE(&R[0], eip->ehy_Au); VMOVE(&R[4], y_dir); VMOVE(&R[8], Hu); VEC3X3MAT(new_cvpt, cvpt, R); VMOVE(cvpt, new_cvpt); // Translate according to V vect_t scale_v; VSCALE(scale_v, eip->ehy_V, ctrlpt.w); VADD2(cvpt, cvpt, scale_v); ON_4dPoint newpt = ON_4dPoint(cvpt[0], cvpt[1], cvpt[2], ctrlpt.w); ehycurvedsurf->SetCV(i, j, newpt); } } (*b)->m_S.Append(ehycurvedsurf); int surfindex = (*b)->m_S.Count(); ON_BrepFace& face = (*b)->NewFace(surfindex - 1); (*b)->FlipFace(face); int faceindex = (*b)->m_F.Count(); (*b)->NewOuterLoop(faceindex-1); }
extern "C" void rt_eto_brep(ON_Brep **b, const struct rt_db_internal *ip, const struct bn_tol *) { struct rt_eto_internal *eip; RT_CK_DB_INTERNAL(ip); eip = (struct rt_eto_internal *)ip->idb_ptr; RT_ETO_CK_MAGIC(eip); point_t p_origin; vect_t v1, v1a, x_dir, y_dir; ON_3dPoint plane_origin; ON_3dVector plane_x_dir, plane_y_dir; double ell_axis_len_1, ell_axis_len_2; // First, find a plane in 3 space with x and y axes // along an axis of the ellipse to be rotated, and its // coordinate origin at the center of the ellipse. // // To identify a point on the eto suitable for use (there // are of course infinitely many such points described by // a circle at radius eto_r from the eto vertex) obtain // a vector at a right angle to the eto normal, unitize it // and scale it. VCROSS(v1, eip->eto_C, eip->eto_N); if (NEAR_ZERO(MAGNITUDE(v1), VUNITIZE_TOL)) { vect_t dir_vect; VSET(dir_vect, 0, 1, 0); VCROSS(v1, dir_vect, eip->eto_N); if (NEAR_ZERO(MAGNITUDE(v1), VUNITIZE_TOL)) { VSET(dir_vect, 1, 0, 0); VCROSS(v1, dir_vect, eip->eto_N); } } point_t temp; VMOVE(temp, v1); VCROSS(v1a, v1, eip->eto_N); VSET(v1, -v1a[0], -v1a[1], -v1a[2]); VUNITIZE( v1 ); VSCALE(v1, v1, eip->eto_r); VADD2(v1, v1, eip->eto_V); VMOVE(x_dir, eip->eto_C); VCROSS(y_dir, x_dir, temp); VSET(p_origin, v1[0], v1[1], v1[2]); plane_origin = ON_3dPoint(p_origin); plane_x_dir = ON_3dVector(x_dir); plane_y_dir = ON_3dVector(y_dir); const ON_Plane ell_plane(plane_origin, plane_x_dir, plane_y_dir); // Once the plane has been created, create the ellipse // within the plane. ell_axis_len_1 = MAGNITUDE(eip->eto_C); ell_axis_len_2 = eip->eto_rd; ON_Ellipse ellipse(ell_plane, ell_axis_len_1, ell_axis_len_2); // Generate an ON_Curve from the ellipse and revolve it // around eto_N ON_NurbsCurve ellcurve; ellipse.GetNurbForm(ellcurve); point_t eto_endvertex; VADD2(eto_endvertex, eip->eto_V, eip->eto_N); ON_3dPoint eto_vertex_pt = ON_3dPoint(eip->eto_V); ON_3dPoint eto_endvertex_pt = ON_3dPoint(eto_endvertex); ON_Line revaxis = ON_Line(eto_vertex_pt, eto_endvertex_pt); ON_RevSurface* eto_surf = ON_RevSurface::New(); eto_surf->m_curve = &ellcurve; eto_surf->m_axis = revaxis; /* Create brep with one face*/ ON_BrepFace *newface = (*b)->NewFace(*eto_surf); (*b)->FlipFace(*newface); // (*b)->Standardize(); // (*b)->Compact(); }
extern "C" void rt_hyp_brep(ON_Brep **b, const struct rt_db_internal *ip, const struct bn_tol *) { struct rt_hyp_internal *eip; RT_CK_DB_INTERNAL(ip); eip = (struct rt_hyp_internal *)ip->idb_ptr; RT_HYP_CK_MAGIC(eip); point_t p1_origin, p2_origin; ON_3dPoint plane1_origin, plane2_origin; ON_3dVector plane_x_dir, plane_y_dir; // First, find planes corresponding to the top and bottom faces - initially vect_t x_dir, y_dir; VMOVE(x_dir, eip->hyp_A); VCROSS(y_dir, eip->hyp_A, eip->hyp_Hi); VREVERSE(y_dir, y_dir); VMOVE(p1_origin, eip->hyp_Vi); plane1_origin = ON_3dPoint(p1_origin); plane_x_dir = ON_3dVector(x_dir); plane_y_dir = ON_3dVector(y_dir); const ON_Plane hyp_bottom_plane(plane1_origin, plane_x_dir, plane_y_dir); VADD2(p2_origin, eip->hyp_Vi, eip->hyp_Hi); plane2_origin = ON_3dPoint(p2_origin); const ON_Plane hyp_top_plane(plane2_origin, plane_x_dir, plane_y_dir); // Next, create ellipses in the planes corresponding to the edges of the hyp ON_Ellipse b_ell(hyp_bottom_plane, MAGNITUDE(eip->hyp_A), eip->hyp_b); ON_NurbsCurve* bcurve = ON_NurbsCurve::New(); b_ell.GetNurbForm((*bcurve)); bcurve->SetDomain(0.0, 1.0); ON_Ellipse t_ell(hyp_top_plane, MAGNITUDE(eip->hyp_A), eip->hyp_b); ON_NurbsCurve* tcurve = ON_NurbsCurve::New(); t_ell.GetNurbForm((*tcurve)); tcurve->SetDomain(0.0, 1.0); // Generate the bottom cap ON_SimpleArray<ON_Curve*> boundary; boundary.Append(ON_Curve::Cast(bcurve)); ON_PlaneSurface* bp = new ON_PlaneSurface(); bp->m_plane = hyp_bottom_plane; bp->SetDomain(0, -100.0, 100.0); bp->SetDomain(1, -100.0, 100.0); bp->SetExtents(0, bp->Domain(0)); bp->SetExtents(1, bp->Domain(1)); (*b)->m_S.Append(bp); const int bsi = (*b)->m_S.Count() - 1; ON_BrepFace& bface = (*b)->NewFace(bsi); (*b)->NewPlanarFaceLoop(bface.m_face_index, ON_BrepLoop::outer, boundary, true); const ON_BrepLoop* bloop = (*b)->m_L.Last(); bp->SetDomain(0, bloop->m_pbox.m_min.x, bloop->m_pbox.m_max.x); bp->SetDomain(1, bloop->m_pbox.m_min.y, bloop->m_pbox.m_max.y); bp->SetExtents(0, bp->Domain(0)); bp->SetExtents(1, bp->Domain(1)); (*b)->FlipFace(bface); (*b)->SetTrimIsoFlags(bface); boundary.Empty(); delete bcurve; // Generate the top cap boundary.Append(ON_Curve::Cast(tcurve)); ON_PlaneSurface* tp = new ON_PlaneSurface(); tp->m_plane = hyp_top_plane; tp->SetDomain(0, -100.0, 100.0); tp->SetDomain(1, -100.0, 100.0); tp->SetExtents(0, bp->Domain(0)); tp->SetExtents(1, bp->Domain(1)); (*b)->m_S.Append(tp); int tsi = (*b)->m_S.Count() - 1; ON_BrepFace& tface = (*b)->NewFace(tsi); (*b)->NewPlanarFaceLoop(tface.m_face_index, ON_BrepLoop::outer, boundary, true); ON_BrepLoop* tloop = (*b)->m_L.Last(); tp->SetDomain(0, tloop->m_pbox.m_min.x, tloop->m_pbox.m_max.x); tp->SetDomain(1, tloop->m_pbox.m_min.y, tloop->m_pbox.m_max.y); tp->SetExtents(0, bp->Domain(0)); tp->SetExtents(1, bp->Domain(1)); (*b)->SetTrimIsoFlags(tface); delete tcurve; // Now, the hard part. Need an elliptical hyperbolic NURBS surface. // First step is to create a nurbs curve. double MX = eip->hyp_b * eip->hyp_bnr; point_t ep1, ep2, ep3; VSET(ep1, -eip->hyp_b, 0, 0.5*MAGNITUDE(eip->hyp_Hi)); VSET(ep2, -MX*eip->hyp_bnr, 0, 0); VSET(ep3, -eip->hyp_b, 0, -0.5*MAGNITUDE(eip->hyp_Hi)); ON_3dPoint onp1 = ON_3dPoint(ep1); ON_3dPoint onp2 = ON_3dPoint(ep2); ON_3dPoint onp3 = ON_3dPoint(ep3); ON_3dPointArray cpts(3); cpts.Append(onp1); cpts.Append(onp2); cpts.Append(onp3); ON_BezierCurve *bezcurve = new ON_BezierCurve(cpts); bezcurve->MakeRational(); bezcurve->SetWeight(1, bezcurve->Weight(0)/eip->hyp_bnr); ON_NurbsCurve* tnurbscurve = ON_NurbsCurve::New(); bezcurve->GetNurbForm(*tnurbscurve); delete bezcurve; ON_3dPoint revpnt1 = ON_3dPoint(0, 0, -0.5*MAGNITUDE(eip->hyp_Hi)); ON_3dPoint revpnt2 = ON_3dPoint(0, 0, 0.5*MAGNITUDE(eip->hyp_Hi)); ON_Line revaxis = ON_Line(revpnt1, revpnt2); ON_RevSurface* hyp_surf = ON_RevSurface::New(); hyp_surf->m_curve = tnurbscurve; hyp_surf->m_axis = revaxis; hyp_surf->m_angle = ON_Interval(0, 2*ON_PI); // Get the NURBS form of the surface ON_NurbsSurface *hypcurvedsurf = ON_NurbsSurface::New(); hyp_surf->GetNurbForm(*hypcurvedsurf, 0.0); delete hyp_surf; for (int i = 0; i < hypcurvedsurf->CVCount(0); i++) { for (int j = 0; j < hypcurvedsurf->CVCount(1); j++) { point_t cvpt; ON_4dPoint ctrlpt; hypcurvedsurf->GetCV(i, j, ctrlpt); // Scale and shear vect_t proj_ah; vect_t proj_ax; fastf_t factor; VPROJECT(eip->hyp_A, eip->hyp_Hi, proj_ah, proj_ax); VSET(cvpt, ctrlpt.x * MAGNITUDE(proj_ax)/eip->hyp_b, ctrlpt.y, ctrlpt.z); factor = VDOT(eip->hyp_A, eip->hyp_Hi)>0 ? 1.0 : -1.0; cvpt[2] += factor*cvpt[0]/MAGNITUDE(proj_ax)*MAGNITUDE(proj_ah) + 0.5*MAGNITUDE(eip->hyp_Hi)*ctrlpt.w; // Rotate vect_t Au, Bu, Hu; mat_t R; point_t new_cvpt; VSCALE(Bu, y_dir, 1/MAGNITUDE(y_dir)); VSCALE(Hu, eip->hyp_Hi, 1/MAGNITUDE(eip->hyp_Hi)); VCROSS(Au, Bu, Hu); VUNITIZE(Au); MAT_IDN(R); VMOVE(&R[0], Au); VMOVE(&R[4], Bu); VMOVE(&R[8], Hu); VEC3X3MAT(new_cvpt, cvpt, R); VMOVE(cvpt, new_cvpt); // Translate vect_t scale_v; VSCALE(scale_v, eip->hyp_Vi, ctrlpt.w); VADD2(cvpt, cvpt, scale_v); ON_4dPoint newpt = ON_4dPoint(cvpt[0], cvpt[1], cvpt[2], ctrlpt.w); hypcurvedsurf->SetCV(i, j, newpt); } } (*b)->m_S.Append(hypcurvedsurf); int surfindex = (*b)->m_S.Count(); ON_BrepFace& face = (*b)->NewFace(surfindex - 1); (*b)->FlipFace(face); int faceindex = (*b)->m_F.Count(); (*b)->NewOuterLoop(faceindex-1); }
ON_3dVector ON_Quaternion::Vector() const { return ON_3dVector(b,c,d); }
extern "C" void rt_sketch_brep(ON_Brep **b, const struct rt_db_internal *ip, const struct bn_tol *UNUSED(tol)) { struct rt_sketch_internal *eip; RT_CK_DB_INTERNAL(ip); eip = (struct rt_sketch_internal *)ip->idb_ptr; RT_SKETCH_CK_MAGIC(eip); ON_3dPoint plane_origin; ON_3dVector plane_x_dir, plane_y_dir; // Find plane in 3 space corresponding to the sketch. plane_origin = ON_3dPoint(eip->V); plane_x_dir = ON_3dVector(eip->u_vec); plane_y_dir = ON_3dVector(eip->v_vec); const ON_Plane sketch_plane = ON_Plane(plane_origin, plane_x_dir, plane_y_dir); // For the brep, need the list of 3D vertex points. In sketch, they // are stored as 2D coordinates, so use the sketch_plane to define 3 space // points for the vertices. for (size_t i = 0; i < eip->vert_count; i++) { (*b)->NewVertex(sketch_plane.PointAt(eip->verts[i][0], eip->verts[i][1]), 0.0); } // Create the brep elements corresponding to the sketch lines, curves // and bezier segments. Create 2d, 3d and BrepEdge elements for each segment. // Will need to use the bboxes of each element to // build the overall bounding box for the face. Use bGrowBox to expand // a single box. struct line_seg *lsg; struct carc_seg *csg; struct bezier_seg *bsg; uint32_t *lng; for (size_t i = 0; i < (&eip->curve)->count; i++) { lng = (uint32_t *)(&eip->curve)->segment[i]; switch (*lng) { case CURVE_LSEG_MAGIC: { lsg = (struct line_seg *)lng; ON_Curve* lsg3d = new ON_LineCurve((*b)->m_V[lsg->start].Point(), (*b)->m_V[lsg->end].Point()); lsg3d->SetDomain(0.0, 1.0); (*b)->m_C3.Append(lsg3d); } break; case CURVE_CARC_MAGIC: csg = (struct carc_seg *)lng; if (csg->radius < 0) { ON_3dPoint cntrpt = (*b)->m_V[csg->end].Point(); ON_3dPoint edgept = (*b)->m_V[csg->start].Point(); ON_Plane cplane = ON_Plane(cntrpt, plane_x_dir, plane_y_dir); ON_Circle c3dcirc = ON_Circle(cplane, cntrpt.DistanceTo(edgept)); ON_Curve* c3d = new ON_ArcCurve((const ON_Circle)c3dcirc); c3d->SetDomain(0.0, 1.0); (*b)->m_C3.Append(c3d); } else { // need to calculated 3rd point on arc - look to sketch.c around line 581 for // logic } break; case CURVE_BEZIER_MAGIC: bsg = (struct bezier_seg *)lng; { ON_3dPointArray bezpoints(bsg->degree + 1); for (int j = 0; j < bsg->degree + 1; j++) { bezpoints.Append((*b)->m_V[bsg->ctl_points[j]].Point()); } ON_BezierCurve bez3d = ON_BezierCurve((const ON_3dPointArray)bezpoints); ON_NurbsCurve* beznurb3d = ON_NurbsCurve::New(); bez3d.GetNurbForm(*beznurb3d); beznurb3d->SetDomain(0.0, 1.0); (*b)->m_C3.Append(beznurb3d); } break; default: bu_log("Unhandled sketch object\n"); break; } } // Create the plane surface and brep face. ON_PlaneSurface *sketch_surf = new ON_PlaneSurface(sketch_plane); (*b)->m_S.Append(sketch_surf); int surfindex = (*b)->m_S.Count(); ON_BrepFace& face = (*b)->NewFace(surfindex - 1); // For the purposes of BREP creation, it is necessary to identify // loops created by sketch segments. This information is not stored // in the sketch data structures themselves, and thus must be deduced FindLoops(b); const ON_BrepLoop* tloop = (*b)->m_L.First(); sketch_surf->SetDomain(0, tloop->m_pbox.m_min.x, tloop->m_pbox.m_max.x); sketch_surf->SetDomain(1, tloop->m_pbox.m_min.y, tloop->m_pbox.m_max.y); sketch_surf->SetExtents(0, sketch_surf->Domain(0)); sketch_surf->SetExtents(1, sketch_surf->Domain(1)); (*b)->SetTrimIsoFlags(face); (*b)->FlipFace(face); (*b)->Compact(); }
// Copyright (c) 1993-2007 Robert McNeel & Associates. All rights reserved. // Rhinoceros is a registered trademark of Robert McNeel & Assoicates. // // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. // ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF // MERCHANTABILITY ARE HEREBY DISCLAIMED. // // For complete openNURBS copyright information see <http://www.opennurbs.org>. // //////////////////////////////////////////////////////////////// */ #include "opennurbs.h" const ON_Plane ON_xy_plane( ON_3dPoint(0.0,0.0,0.0), ON_3dVector(1.0,0.0,0.0), ON_3dVector(0.0,1.0,0.0) ); const ON_Plane ON_yz_plane( ON_3dPoint(0.0,0.0,0.0), ON_3dVector(0.0,1.0,0.0), ON_3dVector(0.0,0.0,1.0) ); const ON_Plane ON_zx_plane( ON_3dPoint(0.0,0.0,0.0), ON_3dVector(0.0,0.0,1.0), ON_3dVector(1.0,0.0,0.0) ); const ON_Plane ON_Plane::World_xy=ON_xy_plane;
void ON_Light::SetAttenuation(double a,double b,double c) { m_attenuation = ON_3dVector(a,b,c);; }