int WlzEdgeVerticesPoly( WlzPolygonDomain *poly, WlzDVertex3 **vtxs, int numVtxs, WlzErrorNum *dstErr) { int nVtxs=0; WlzErrorNum errNum=WLZ_ERR_NONE; WlzObject *polyObj; int i; /* convert to an 8-connected polyline */ if( poly ){ if((polyObj = WlzPolyTo8Polygon(poly, 1, &errNum)) != NULL){ nVtxs = polyObj->domain.poly->nvertices; if( numVtxs > 0 ){ *vtxs = AlcRealloc(*vtxs, sizeof(WlzDVertex3)* (numVtxs + nVtxs)); } else { numVtxs = 0; *vtxs = AlcMalloc(sizeof(WlzDVertex3)*nVtxs); } switch( polyObj->domain.poly->type ){ case WLZ_POLYGON_INT: for(i=0; i < nVtxs; i++){ (*vtxs)[numVtxs+i].vtX = polyObj->domain.poly->vtx[i].vtX; (*vtxs)[numVtxs+i].vtY = polyObj->domain.poly->vtx[i].vtY; (*vtxs)[numVtxs+i].vtZ = 0.0; } break; case WLZ_POLYGON_FLOAT: for(i=0; i < nVtxs; i++){ (*vtxs)[numVtxs+i].vtX = ((WlzFVertex2 *) polyObj->domain.poly->vtx)[i].vtX; (*vtxs)[numVtxs+i].vtY = ((WlzFVertex2 *) polyObj->domain.poly->vtx)[i].vtY; (*vtxs)[numVtxs+i].vtZ = 0.0; } break; case WLZ_POLYGON_DOUBLE: for(i=0; i < nVtxs; i++){ (*vtxs)[numVtxs+i].vtX = ((WlzDVertex2 *) polyObj->domain.poly->vtx)[i].vtX; (*vtxs)[numVtxs+i].vtY = ((WlzDVertex2 *) polyObj->domain.poly->vtx)[i].vtY; (*vtxs)[numVtxs+i].vtZ = 0.0; } break; default: errNum = WLZ_ERR_POLYGON_TYPE; break; } WlzFreeObj(polyObj); } } if( dstErr ){ *dstErr = errNum; } nVtxs += numVtxs; return nVtxs; }
void conformal_input_cb( Widget w, XtPointer client_data, XtPointer call_data) { ThreeDViewStruct *view_struct = (ThreeDViewStruct *) client_data; WlzThreeDViewStruct *wlzViewStr= view_struct->wlzViewStr; XmAnyCallbackStruct *cbs = (XmAnyCallbackStruct *) call_data; int x, y; int i; WlzPolygonDomain *startPoly; WlzFVertex2 fpVtx, *fvtxs; WlzObject *polygon; WlzErrorNum errNum=WLZ_ERR_NONE; /* switch on event type */ switch( cbs->event->type ){ case ButtonPress: switch( cbs->event->xbutton.button ){ case Button1: specialTriggered = 1; /* get the polyline, rescale as required */ fpVtx.vtX = cbs->event->xbutton.x; fpVtx.vtY = cbs->event->xbutton.y; fvtxs = &fpVtx; startPoly = WlzAssignPolygonDomain( WlzMakePolygonDomain(WLZ_POLYGON_FLOAT, 1, (WlzIVertex2 *) fvtxs, 1, 1, NULL), &errNum); if( confPoly ){ WlzFreePolyDmn(confPoly); } globals.paint_action_quit_flag = 0; confPoly = HGU_XGetPolyDomain(XtDisplay(view_struct->canvas), XtWindow(view_struct->canvas), 0, NULL, startPoly); WlzFreePolyDmn(startPoly); if( confPoly == NULL ){ break; } /* convert to an 8-connected polyline */ if((polygon = WlzPolyTo8Polygon(confPoly, 1, &errNum))){ WlzFreePolyDmn(confPoly); if((confPoly = WlzAssignPolygonDomain( WlzMakePolygonDomain(WLZ_POLYGON_INT, polygon->domain.poly->nvertices, polygon->domain.poly->vtx, polygon->domain.poly->nvertices, 1, &errNum), NULL))){ confPoly->type = WLZ_POLYGON_FLOAT; fvtxs = (WlzFVertex2 *) confPoly->vtx; for(i=0; i < confPoly->nvertices; i++){ fvtxs[i].vtX = (float) confPoly->vtx[i].vtX; fvtxs[i].vtY = (float) confPoly->vtx[i].vtY; } } } /* determine the conformal approximate coordinate mesh */ conformalCalculateMeshCb(w, client_data, call_data); /* display the polyline and mesh */ conformalDisplayPolysCb(w, client_data, call_data); break; case Button2: break; case Button3: /* unused */ default: break; } break; case ButtonRelease: switch( cbs->event->xbutton.button ){ case Button1: break; case Button2: x = cbs->event->xbutton.x / wlzViewStr->scale; y = cbs->event->xbutton.y / wlzViewStr->scale; display_pointer_feedback_information(view_struct, x, y); break; case Button3: /* check if have been drawing */ if( specialTriggered ){ specialTriggered = 0; break; } /* revert to normal mode */ view_struct->noPaintingFlag = 0; view_struct->titleStr = "Section view"; set_view_dialog_title(view_struct->dialog, wlzViewStr->theta, wlzViewStr->phi); /* set sensitivities */ XtSetSensitive(view_struct->controls, True); XtSetSensitive(view_struct->slider, True); setControlButtonsSensitive(view_struct, True); /* swap the callbacks to special mode */ XtRemoveCallback(view_struct->canvas, XmNexposeCallback, conformalDisplayPolysCb, view_struct); XtRemoveCallback(view_struct->canvas, XmNinputCallback, conformal_input_cb, client_data); XtAddCallback(view_struct->canvas, XmNinputCallback, canvas_input_cb, client_data); /* clear the polyline */ if( confPoly ){ WlzFreePolyDmn(confPoly); confPoly = NULL; } break; default: break; } break; case MotionNotify: if( cbs->event->xmotion.state & Button1Mask ){ } if( cbs->event->xmotion.state & Button2Mask ) { x = cbs->event->xmotion.x / wlzViewStr->scale; y = cbs->event->xmotion.y / wlzViewStr->scale; display_pointer_feedback_information(view_struct, x, y); } break; case KeyPress: switch( XLookupKeysym(&(cbs->event->xkey), 0) ){ case XK_Right: case XK_KP_Right: case XK_f: break; case XK_Up: case XK_p: break; case XK_Left: case XK_KP_Left: case XK_b: break; case XK_Down: case XK_n: break; } break; default: break; } if( errNum != WLZ_ERR_NONE ){ MAPaintReportWlzError(globals.topl, "conformal_input_cb", errNum); } return; }