|
|
QisBool
Sample Code |
|
Booleanize |
|
Single threaded union of polygons obtained
from a single window using QisLib |
|
|
booleanize.cpp |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "qislib.h" ////Include file
for QisLib Code #include "qisbool.h" ////Include
file for QisBool Code /* User driven input functions. *
This information will be provided by the client application */ const char* User_ExecDir(const char*); const char* User_ExecPath(const char*); const char* User_GDSIIFile(); int User_OpenStructure(); const char* User_ViewStructure(); int User_SetLayers(); const char* User_LayerString(); int User_SetWindow(); void User_GetWindow(CQisWindow*); int User_SetClipWindow(); void User_ClipWindow(int*, int*, int*, int*); int booleanize_main(int argc, char* argv[]) { /* Initialize
QisLib */ #if(defined(WIN32)
|| defined(WIN64)) int ret = QisLib_InitLib(User_ExecDir(argv[0])); #else int ret = QisLib_InitLib(User_ExecPath(argv[0]),
NULL, NULL); #endif if(ret) { fprintf(stderr,
"error: QisLib_InitLib returned %d.\n", ret); if(ret == -3) {
fprintf(stderr, "License error: %s\n", QisLib_GetErrorMsg()); } return 1; } int err = 0; int storageHandle
= -1; void* boolHandle =
0; int** XYOut = 0; int* NVOut = 0; int NOut = 0; do { /* Open a GDSII file */ ret = QisLib_OpenGDSII(User_GDSIIFile()); if(ret) {
fprintf(stderr, "QisLib_OpenGDSII returned %d.\n", ret); err = 1;
break; } /* If desired, Set view structure otherwise work with
the Default top structure */
if(User_OpenStructure()) { ret = QisLib_OpenStructure(User_ViewStructure()); if(ret) {
fprintf(stderr, "QisLib_OpenStructure returned %d.\n", ret); err = 1;
break; } } /* If desired, Set certain layers otherwise work with
all layers */
if(User_SetLayers()) { QisLib_SetLayersOff("ALL"); QisLib_SetLayersOn(User_LayerString()); } /* If desired, Set a window of interest *
otherwise work with the extents of the current structure */
if(User_SetWindow()) { CQisWindow
win;
User_GetWindow(&win); QisLib_SetExactWindow(win); } /* Collect boundaries belonging to the window specified
above *
Convert any paths to boundaries */ QisLib_SetVectorUnit(_QISUNIT_DBU); QisLib_SetGetVectorPath(_QISPATH_BNDRY); longlong N; int* NV = 0; int** XY = 0; storageHandle = QStore_GetDataVectorBoundaries(&N, &XY, &NV); if(storageHandle
< 0) {
fprintf(stderr, "QStore_GetDataVectorBoundaries returned
%d.", storageHandle); err = 1;
break; } /* Write input boundaries as text */ FILE* fptr =
fopen("inputpolys.txt", "w"); if(fptr) { fprintf(fptr,
"%d\n", (int)(N)); for(int i=0;
i<N; i++) {
fprintf(fptr, "[%d] ", NV[i]); for(int j=0;
j<(NV[i]*2); j+=2)
fprintf(fptr, "%d,%d ", XY[j], XY[j+1]);
fprintf(fptr, "\n"); } fclose(fptr); } /* Create QisBool instance */ char
errMsg[1024]; boolHandle = QisBool_Create(errMsg); if(!boolHandle)
{
fprintf(stderr, "error: QisBool_Create %s\n", errMsg); err = 1;
break; } /* If desired, Set clipping window otherwise do not
clip the boundaries */
if(User_SetClipWindow()) { int minx,
miny, maxx, maxy; User_ClipWindow(&minx,
&miny, &maxx, &maxy); QisBoolOptions_SetClipWindow(minx, miny, maxx, maxy, boolHandle); } /* Set Max. Output vertex count (QisLib allows max.
8190 vertices per polygon) */ QisBoolOptions_SetMaxPoints(8190, boolHandle); /* Unionize collected boundaries */ ret = QisBool_Booleanize( eUNION_OPCODE,
XY, NV, N, NULL, NULL, 0, &XYOut, &NVOut, &NOut, boolHandle ); if(ret < 0) {
fprintf(stderr, "error: QisBool_Booleanize %s\n", QisBool_ErrorMsg(ret, boolHandle)); err = 1; break; } else if(ret
> 0) {
fprintf(stderr, "warning: QisBool_Booleanize %s\n", QisBool_ErrorMsg(ret, boolHandle)); } /* Write output boundaries as text */ fptr = fopen("outputpolys.txt",
"w"); if(fptr) { fprintf(fptr,
"%d\n", (int)(NOut)); for(int i=0;
i<NOut; i++) {
fprintf(fptr, "[%d] ", NVOut[i]); for(int j=0;
j<(NVOut[i]*2); j+=2)
fprintf(fptr, "%d,%d ", XYOut[j], XYOut[j+1]);
fprintf(fptr, "\n"); } fclose(fptr); } } while(0); /* Cleanup and Close */ if((NOut > 0)
&& NVOut && XYOut) QisBool_Release(&XYOut, &NVOut, &NOut); if(boolHandle) QisBool_Destroy(&boolHandle); if(storageHandle
>= 0) QStore_Release(storageHandle); return err; } |
|
|
© 2012 Artwork Conversion
Software Inc. |
|
417 Ingalls St. Santa Cruz CA
95060 |
|
[T] +1 831-426-6163 [F] +1
831-[E] info@artwork.com |