Drills.

 

Let's create a scene of five drills and a plate with five holes below the drills.

 

To start with, let's write the function creating the clip of the drill of the specified radius. The drill clip will be a contour of 8 line segments and 4 arcs. The function creating the clip will be the following:

 

sgCContour* CreateDrillSection(double rad)

{

 sgCObject*  objcts[6];

 

 objcts[0] = sgCreateLine(0.0, -0.99*rad, 0.0, -0.05*rad, -0.99*rad, 0.0);

 objcts[1] = sgCreateLine(-0.05*rad, -0.99*rad, 0.0, -0.05*rad, -0.97*rad, 0.0);

 

 SG_ARC arcGeo;

 SG_POINT arcP1;

 SG_POINT arcP2;

 SG_POINT arcP3;

 

 arcP1.x = -0.05*rad;  arcP1.y = -0.97*rad; arcP1.z = 0.0;

 arcP2.x = -1.0*rad;   arcP2.y = 0.0;       arcP2.z = 0.0;

 arcP3.x = -0.87*rad;  arcP3.y = -0.5*rad;  arcP3.z = 0.0;

 

 arcGeo.FromTreePoints(arcP1,arcP2,arcP3,false);

 

 objcts[2] = sgCreateArc(arcGeo);

 

 arcP1.x = -1.0*rad;   arcP1.y = 0.0;       arcP1.z = 0.0;

 arcP2.x = -0.05*rad;  arcP2.y = 0.0;       arcP2.z = 0.0;

 arcP3.x = -0.35*rad;  arcP3.y = -0.33*rad; arcP3.z = 0.0;

 

 arcGeo.FromTreePoints(arcP1,arcP2,arcP3,false);

 

 objcts[3] = sgCreateArc(arcGeo);

 

 objcts[4] = sgCreateLine(-0.05*rad, 0.0, 0.0, -0.05*rad, 0.99*rad, 0.0);

 objcts[5] = sgCreateLine(-0.05*rad, 0.99*rad, 0.0, 0.0, 0.99*rad, 0.0);

 

 sgCContour*  cnt1 = sgCContour::CreateContour(objcts,6);

 sgCContour*  cnt2 = (sgCContour*)cnt1->Clone();

 

 SG_POINT     rotAxeP = {0.0, 0.0, 0.0};

 SG_VECTOR    rotAxeDir = {0.0, 0.0, 1.0};

 cnt2->InitTempMatrix()->Rotate(rotAxeP,rotAxeDir,3.14159265);

 cnt2->ApplyTempMatrix();

 cnt2->DestroyTempMatrix();

 

 objcts[0] = cnt1;

 objcts[1] = cnt2;

 

 return sgCContour::CreateContour(objcts,2);

}

 

Then let's create five drills - four drills with radius 1 and one drill - with 2.5 - using the operation of constructing a solid from clips. The following function creates a drill:

 

 

sgCObject* CreateDrill(double rad, double dH)

{

 sgC2DObject* drill_1_sections[10];

 double       params[10];

 memset(params,0,sizeof(double)*10);

 drill_1_sections[0] = CreateDrillSection(rad);

 

 SG_POINT     rotAxeP = {0.0, 0.0, 0.0};

 SG_VECTOR    rotAxeDir = {0.0, 0.0, 1.0};

 SG_VECTOR    transVec = {0.0, 0.0, 1.0};

 for (int i=1;i<7;i++)

 {

         drill_1_sections[i] = (sgCContour*)(drill_1_sections[0]->Clone());

         drill_1_sections[i]->InitTempMatrix()->Rotate(rotAxeP,rotAxeDir,i*5.0*3.14159265/6.0);

         transVec.z = dH*i;

         drill_1_sections[i]->GetTempMatrix()->Translate(transVec);

         drill_1_sections[i]->ApplyTempMatrix();

         drill_1_sections[i]->DestroyTempMatrix();

 }

 

 SG_CIRCLE cirGeo;

 cirGeo.center.x = cirGeo.center.y = 0.0;  cirGeo.center.z = 7*dH+5;

 cirGeo.normal.x = cirGeo.normal.y = 0.0;  cirGeo.normal.z = 1.0;

 cirGeo.radius = rad-0.1;

 

 drill_1_sections[7] = sgCreateCircle(cirGeo);

 drill_1_sections[7]->ChangeOrient();

 cirGeo.center.z = 7*dH+10;

 drill_1_sections[8] = sgCreateCircle(cirGeo);

 drill_1_sections[8]->ChangeOrient();

 cirGeo.center.z =7*dH+15;

 drill_1_sections[9] = sgCreateCircle(cirGeo);

 drill_1_sections[9]->ChangeOrient();

 

 

 sgCObject* resul = sgSurfaces::SplineSurfaceFromSections((const sgC2DObject**)drill_1_sections,

         params,10,true);

 

 for (int i=0;i<10;i++)

         sgDeleteObject(drill_1_sections[i]);

 

 return resul;

}

 

And then we'll use this function to create the drills:

  m_drills[0] = CreateDrill(1.0,5.0);

 m_drills[1] = m_drills[0]->Clone();

 m_drills[2] = m_drills[0]->Clone();

 m_drills[3] = m_drills[0]->Clone();

m_drills[4] = CreateDrill(2.5,8.0);

 

Let's create a plate in the form of a box in which later on we'll construct the holes below the drills:

  sgCObject*  tmpOb1;

 tmpOb1 = sgCreateBox(40.0,40.0, 1.0);

 transVec.x = -20.0;

 transVec.y = -20.0;

 transVec.z = -4.0;

 tmpOb1->InitTempMatrix()->Translate(transVec);

 tmpOb1->ApplyTempMatrix();

 tmpOb1->DestroyTempMatrix();

 

To create the holes let's use the boolean subtraction of cylinders with radii equal to the drill radii from the plate:

  sgCCylinder*  holes[5];

 for (int i=0;i<4;i++)

         holes[i] = sgCCylinder::Create(1.0, 20.0, 24);

 holes[4] = sgCCylinder::Create(2.5, 20.0, 24);

 

      for (int i=0;i<5;i++)

 {

         tmpGroup = sgBoolean::Sub((const sgC3DObject&)(*tmpOb1),

                                                                 (const sgC3DObject&)(*holes[i]));

         ASSERT(tmpGroup->GetChildrenList()->GetCount()==1);

         sgDeleteObject(tmpOb1);

         tmpGroup->BreakGroup(&tmpOb1);

         sgDeleteObject(tmpGroup);

         sgDeleteObject(holes[i]);

 }

 

 

See also:

sgBoolean::Sub      

sgSurfaces::SplineSurfaceFromSections  

sgCArc   SG_ARC

sgCLine SG_LINE

sgCContour   sgCContour::CreateContour

sgGetScene sgCScene::AttachObject   sgCObject::SetAttribute

 

Result:

drills