Пример #1
0
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;
}
Пример #2
0
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;
}