Create Block Definition and Insert Block Instance Example (C#)
This example shows how to create a block definition and insert a block
instance in a drawing.
using System;
using System.Collections.Generic;
using System.Text;
using SldWorks;
using SwConst;
//---------------------------------------------------------------------------
//
// Preconditions:
// (1)
SolidWorks is running and drawing is open.
// (2)
This project has references to sldworks.tlb and swconst.tlb.
//
// Postconditions:
// (1)
Block definition is created.
// (2)
First instance of the block is inserted in the upper-left
// corner
of the drawing sheet.
// (3)
Second instance of the block is inserted into the
// drawing
sheet.
//
// NOTE: Customize the creation of the entities to suit
your situation.
//
//---------------------------------------------------------------------------
namespace SketchBlocks
{
class
Program
{
static
void Main(string[] args)
{
SldWorks.SldWorks
swApp = new SldWorks.SldWorks();
ModelDoc2
swModel;
ModelDoc2
swModel2;
DrawingDoc
swDraw;
SketchSegment[]
swSkSeg = new SketchSegment[14];
SketchPoint[]
swSkPt = new SketchPoint[4];
Note[]
swSkNote = new Note[3];
Object
vSkSeg;
Object
vSkPt;
Object
vSkNote;
Boolean
bRet;
SketchBlockDefinition
swSketchBlockDef;
SketchBlockDefinition
swSketchBlockDef2;
SketchBlockInstance
swBlockInst;
SketchManager
swSketchMgr;
ModelDocExtension
swModelDocExt;
MathUtility
swMathUtil;
MathPoint
swMathPoint;
MathPoint
swMathPoint2;
MathPoint
swMathPoint3;
double[]
nPt = new double[3];
Object
vPt;
long
nbrSelObjects;
Object
vInstPt;
swApp
= (SldWorks.SldWorks)System.Runtime.InteropServices.Marshal.GetActiveObject("SldWorks.Application");
swModel
= swApp.IActiveDoc2;
swDraw
= (DrawingDoc)swModel;
//Make
a copy of the open drawing
//Use
the path and name of your drawing
string
CopyName = "C:\Samples\Copy.SLDDRW";
swModel.SaveAsSilent(CopyName,true);
//Interfaces
needed for block APIs
swSketchMgr
= swModel.SketchManager;
swModelDocExt
= swModel.Extension;
swMathUtil
= swApp.IGetMathUtility();
//--------------------------------------------------------------------
//Turn
off grid and entity snapping
swModel.SetAddToDB(true);
//
Revision box
swSkSeg[0]
= (SketchSegment)swModel.CreateLine2(0.008372353756316,
0.207929860362, 0, 0.05495488122133, 0.207929860362, 0);
swSkSeg[1]
= (SketchSegment)swModel.CreateLine2(0.05495488122133,
0.207929860362, 0, 0.05495488122133, 0.1992788195471, 0);
swSkSeg[2]
= (SketchSegment)swModel.CreateLine2(0.05495488122133,
0.1992788195471, 0, 0.008372353756316, 0.1992788195471, 0);
swSkSeg[3]
= (SketchSegment)swModel.CreateLine2(0.008372353756316,
0.1992788195471, 0, 0.008372353756316, 0.207929860362, 0);
swSkSeg[4]
= (SketchSegment)swModel.CreateLine2(0.023613610833382,
0.207929860362, 0, 0.023613610833382, 0.1992788195471, 0);
swSkSeg[5]
= (SketchSegment)swModel.CreateLine2(0.03964919362569,
0.207929860362, 0, 0.03964919362569, 0.1992788195471, 0);
//--------------------------------------------------------------------
//
Clear selections; otherwise, notes are attached to line
swModel.ClearSelection2(true);
//
Revision notes
swSkNote[0]
= (Note)swModel.InsertNote("Cell
1");
swSkNote[1]
= (Note)swModel.InsertNote("Cell
2");
swSkNote[2]
= (Note)swModel.InsertNote("Cell
3");
PositionNote(swModel,
swSkNote[0], 0.009481461553102, 0.2052680016497, 0.0);
PositionNote(swModel,
swSkNote[1], 0.025613610833382, 0.2052680016497, 0.0);
PositionNote(swModel,
swSkNote[2], 0.04275469545669, 0.2052680016497, 0.0);
//
Points for circles
swSkPt[0]
= (SketchPoint)swModel.CreatePoint2(0.02700536474232,
0.1708856599494, 0);
swSkPt[1]
= (SketchPoint)swModel.CreatePoint2(0.02700536474232,
0.1815330947985, 0);
swSkPt[2]
= (SketchPoint)swModel.CreatePoint2(0.03964919362569,
0.1815330947985, 0);
swSkPt[3]
= (SketchPoint)swModel.CreatePoint2(0.05029662847483,
0.1708856599494, 0);
//
Circles
swSkSeg[6]
= (SketchSegment)swModel.CreateCircle2(swSkPt[0].X,
swSkPt[0].Y, swSkPt[0].Z, 0.03050393605009, 0.169349494074, 0.0);
swSkSeg[7]
= (SketchSegment)swModel.CreateCircle2(swSkPt[1].X,
swSkPt[1].Y, swSkPt[1].Z, 0.03305243799009, 0.183621104938, 0.0);
swSkSeg[8]
= (SketchSegment)swModel.CreateCircle2(swSkPt[2].X,
swSkPt[2].Y, swSkPt[2].Z, 0.04426584652606, 0.182092003774, 0.0);
swSkSeg[9]
= (SketchSegment)swModel.CreateCircle2(swSkPt[3].X,
swSkPt[3].Y, swSkPt[3].Z, 0.05496955467404, 0.164252490194, 0.0);
//
Lines between circles
swSkSeg[10]
= (SketchSegment)swModel.CreateLine2(swSkPt[0].X,
swSkPt[0].Y, swSkPt[0].Z, swSkPt[1].X, swSkPt[1].Y, swSkPt[1].Z);
swSkSeg[11]
= (SketchSegment)swModel.CreateLine2(swSkPt[1].X,
swSkPt[1].Y, swSkPt[1].Z, swSkPt[2].X, swSkPt[2].Y, swSkPt[2].Z);
swSkSeg[12]
= (SketchSegment)swModel.CreateLine2(swSkPt[2].X,
swSkPt[2].Y, swSkPt[2].Z, swSkPt[3].X, swSkPt[3].Y, swSkPt[3].Z);
swSkSeg[13]
= (SketchSegment)swModel.CreateLine2(swSkPt[3].X,
swSkPt[3].Y, swSkPt[3].Z, swSkPt[0].X, swSkPt[0].Y, swSkPt[0].Z);
vSkSeg
= swSkSeg;
vSkPt
= swSkPt;
vSkNote
= swSkNote;
//
Select all sketch segments, sketch points,
//
and notes for the block definition
nbrSelObjects
= swModelDocExt.MultiSelect(vSkSeg,
true, null);
nbrSelObjects
= swModelDocExt.MultiSelect(vSkPt,
true, null);
nbrSelObjects
= swModelDocExt.MultiSelect(vSkNote,
true, null);
//--------------------------------------------------------------------
//Create
block definition
swSketchBlockDef
= swSketchMgr.MakeSketchBlockFromSelected(null);
//Save
block
//Use
the path and name of your drawing
swSketchBlockDef.Save("C:\\Samples\TestBlock.SLDBLK");
//Open
copied drawing
swApp.OpenDoc(CopyName,(int)swDocumentTypes_e.swDocDRAWING);
swModel2
= (ModelDoc2)swApp.ActiveDoc;
swSketchMgr
= swModel2.SketchManager;
//
Define an insertion point
nPt[0]
= 0.0 / 1000.0;
nPt[1]
= 0.0 / 1000.0;
nPt[2]
= 0.0;
vPt
= nPt;
swMathPoint2
= (MathPoint)swMathUtil.CreatePoint(vPt);
//Create
block definition from block file
//Use
the path and name of your drawing
swSketchBlockDef2
= (SketchBlockDefinition)swSketchMgr.MakeSketchBlockFromFile(swMathPoint2,
"C:\\Samples\\TestBlock.SLDBLK", false, 100, 0);
//
Define an insertion point
nPt[0]
= 60.0 / 1000.0;
nPt[1]
= 60.0 / 1000.0;
nPt[2]
= 0.0;
vPt
= nPt;
swMathPoint
= (MathPoint)swMathUtil.CreatePoint(vPt);
//
Insert an instance of the block definition
swBlockInst
= swSketchMgr.InsertSketchBlockInstance(swSketchBlockDef2,
swMathPoint, 0, 0);
//--------------------------------------------------------------------
//
Turn on grid and entity snapping
//swModel.SetAddToDB(false);
//
Redraw to see all changes
swModel2.GraphicsRedraw2();
}
static
private void PositionNote(ModelDoc2 swModel, Note swSkNote, double X_pos,
double Y_pos, double Z_pos)
{
Annotation
swAnn;
long
nRetVal;
bool
bRet;
swAnn
= (Annotation)swSkNote.GetAnnotation();
swSkNote.Angle = 0.0;
bRet
= swSkNote.SetBalloon((int)swBalloonStyle_e.swBS_None,
(int)swBalloonFit_e.swBF_Tightest);
nRetVal
= swAnn.SetLeader2(false, (int)swLeaderSide_e.swLS_SMART,
true, false, false, false);
bRet
= swAnn.SetPosition(X_pos, Y_pos,
Z_pos);
//
Redraw to see changes; however, this is expensive
swModel.GraphicsRedraw2();
}
}
}