Exemplo n.º 1
0
void
MFCSimpleTypeView::ContextMenu(UINT nFlags, CPoint point)
{
	long	caty[] = {
//				TypedValue::S_DOUBLE,
//				TypedValue::S_LAMBDA,
		TypedValue::S_FLOAT,
		TypedValue::S_INT,
		TypedValue::S_SHORT,
		TypedValue::S_BYTE,
		TypedValue::S_BOOL
			};
	CPoint		popPt = point;
	ClientToScreen(&popPt);

	CMenu		*ctxtMenu = new CMenu;
	ctxtMenu->CreatePopupMenu();
	CMenu		*addVarMenu = new CMenu;
	addVarMenu->CreatePopupMenu();

	char		buf[512];
	long	item = ItemAtPoint(point);
	for (short i=0; i<sizeof(caty)/sizeof(caty[0]); i++) {
		if (ID_VARIABLECONTEXT_ADD_VAR + caty[i] > ID_VARIABLECONTEXT_ADD_VAR_TYPE_RANGE) {
			reportError("Internal error. type index value exceeded in menu creator, is %d and shouldn't exceed %d",
					caty[i], ID_VARIABLECONTEXT_ADD_VAR_TYPE_RANGE-ID_VARIABLECONTEXT_ADD_VAR);
		} else {
			string tnm = findTypeName(caty[i]);
			if (tnm.size()) {
				sprintf(buf, "%s", tnm.c_str());
				addVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_ADD_VAR + caty[i], buf);
			}
		}
	}

	ctxtMenu->AppendMenu(MF_POPUP, (UINT) addVarMenu->m_hMenu, "add variable");
	ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_ADD_METHOD, "add method");
	StabEnt		*itemSym = NULL;
	if (item >= 0) {
// delete selected item
// set selected item envelope
// set selected item display type
// set selected item length ... to create an array
		itemSym = SymForItem(item);

		if (itemSym != NULL) {
			CMenu		*setVarTypeMenu = new CMenu;
			setVarTypeMenu->CreatePopupMenu();
			for (short i=0; i<sizeof(caty)/sizeof(caty[0]); i++) {
				if (ID_VARIABLECONTEXT_SET_VAR_TYPE + caty[i] > ID_VARIABLECONTEXT_SET_VAR_TYPE_RANGE) {
					reportError("Internal error. type index value exceeded in menu creator, is %d and shouldn't exceed %d",
							caty[i], ID_VARIABLECONTEXT_SET_VAR_TYPE_RANGE-ID_VARIABLECONTEXT_SET_VAR_TYPE);
				} else {
					string tnm = findTypeName(caty[i]);
					if (tnm.size() && itemSym->type != caty[i]) {
						sprintf(buf, "%s", tnm.c_str());
						setVarTypeMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_SET_VAR_TYPE + caty[i], buf);
					}
				}
			}

			sprintf(buf, "set '%s' type", itemSym->uniqueName());
			ctxtMenu->AppendMenu(MF_POPUP, (UINT) setVarTypeMenu->m_hMenu, buf);

			sprintf(buf, "delete '%s'", itemSym->uniqueName());
			ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_DELETE_SELECTED, buf);
			sprintf(buf, "set '%s' envelope", itemSym->uniqueName());
			ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_ENVELOPE_SELECTED, buf);

			CMenu		*dispVarMenu = new CMenu;
			dispVarMenu->CreatePopupMenu();
			dispVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_NODISPLAY_SELECTED, "none");
			dispVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_CONTROL_SELECTED, "control");
			dispVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_DISPLAY_SELECTED, "display");
			sprintf(buf, "set '%s' display", itemSym->uniqueName());
			ctxtMenu->AppendMenu(MF_POPUP, (UINT) dispVarMenu->m_hMenu, buf);

			ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_SET_LENGTH_SELECTED, "set length");
		}
	}

// add item
//    by type
// structures ????
	short ret = ctxtMenu->TrackPopupMenuEx(
						TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RETURNCMD,
						popPt.x, popPt.y, this, NULL);

	if (ret >= ID_VARIABLECONTEXT_ADD_VAR && ret <= ID_VARIABLECONTEXT_ADD_VAR_TYPE_RANGE) {
		long typ = ret - ID_VARIABLECONTEXT_ADD_VAR;
		if (parent && parent->Symbol()) {
			StabEnt	*pSym = parent->Symbol();
			Stackable	*stkbl = pSym->StackableValue();
			if (stkbl) {
				char	*vnm = "variable%d";
				switch(typ) {
				case TypedValue::S_BYTE: vnm = "bytevar"; break;
					case TypedValue::S_SHORT: vnm = "wordvar"; break;
					case TypedValue::S_INT: vnm = "intvar"; break;
					case TypedValue::S_LONG: vnm = "longvar"; break;
					case TypedValue::S_FLOAT: vnm = "floatvar"; break;
				}
				string	nmbuf = glob.makeUniqueName(pSym, vnm, 1);
				StabEnt	*nsym=DefineSymbol(nmbuf, typ, 0, 0, pSym, TypedValue::REF_STACK, false, false, StabEnt::DISPLAY_NOT);
				stkbl->ReAllocateChildren();
				AddSym(nsym);
			}
		}
	} else if (ret == ID_VARIABLECONTEXT_ADD_METHOD) {
		if (parent && parent->Symbol()) {
			StabEnt	*pSym = parent->Symbol();
			string nmbuf = glob.makeUniqueName(pSym, "action", 1);
			QuaPerceptualSet	*quaLink=parent->QuaLink();
			if (quaLink) {
                StabEnt *mSym = quaLink->CreateMethod(nmbuf, pSym);
				if (mSym) {
					AddSym(mSym);
					fprintf(stderr, "tried to add method element\n");
				}
			}
		}
	} else if (ret >= ID_VARIABLECONTEXT_SET_VAR_TYPE && ret <= ID_VARIABLECONTEXT_SET_VAR_TYPE_RANGE) {
		long typ = ret - ID_VARIABLECONTEXT_SET_VAR_TYPE;
		if (itemSym && parent && parent->Symbol()) {
			StabEnt	*pSym = parent->Symbol();
			Stackable	*stkbl = pSym->StackableValue();
			if (stkbl) {
				bool	validChange = false;
				switch(typ) {
				case TypedValue::S_BYTE: validChange = true; break;
					case TypedValue::S_SHORT: validChange = true; break;
					case TypedValue::S_INT: validChange = true; break;
					case TypedValue::S_LONG: validChange = true; break;
					case TypedValue::S_FLOAT: validChange = true; break;
				}
				if (validChange) {
					itemSym->type = typ;
					stkbl->ReAllocateChildren();
				}
			}
		}
	} else if (ret == ID_VARIABLECONTEXT_DELETE_SELECTED) {
		if (itemSym) {
			glob.DeleteSymbol(itemSym, true);
			RemoveSym(itemSym);
			if (parent && parent->Symbol()) {
				StabEnt	*pSym = parent->Symbol();
				Stackable	*stkbl = pSym->StackableValue();
				if (stkbl) {
					stkbl->ReAllocateChildren();
				}
			}
		}
	} else if (ret == ID_VARIABLECONTEXT_ENVELOPE_SELECTED) {
		if (itemSym) {
			itemSym->SetEnvelopeMode(true);
		}
	} else if (ret == ID_VARIABLECONTEXT_NODISPLAY_SELECTED) {
		if (itemSym) {
			itemSym->SetDisplayMode(StabEnt::DISPLAY_NOT);
// forces redisplay of this entry to show icon change
			GetListCtrl().SetItemText(item, 3, "N");
		}
	} else if (ret == ID_VARIABLECONTEXT_DISPLAY_SELECTED) {
		if (itemSym) {
			itemSym->SetDisplayMode(StabEnt::DISPLAY_DISP);
// forces redisplay of this entry
			GetListCtrl().SetItemText(item, 3, "D");
		}
	} else if (ret == ID_VARIABLECONTEXT_CONTROL_SELECTED) {
		if (itemSym) {
			itemSym->SetDisplayMode(StabEnt::DISPLAY_CTL);
// forces redisplay of this entry
			GetListCtrl().SetItemText(item, 3, "C");
		}
	} else if (ret == ID_VARIABLECONTEXT_SET_LENGTH_SELECTED) {
		reportError("Currently only undimensioned data are supported by this interface .... but they can be added manually by hand-editting the script");
	}
}
Exemplo n.º 2
0
	void geonDetector::detect(pcl::SacModel geonType)
	{

		  seg.setOptimizeCoefficients (true);
		  seg.setNormalDistanceWeight (0.3);
		  seg.setMethodType (pcl::SAC_RANSAC);
		  seg.setMaxIterations (100);
		  seg.setDistanceThreshold (0.05);
		  seg.setInputCloud (cloud_filtered);
		  seg.setInputNormals (cloud_normals);
		  seg.setModelType (geonType);
		
		//Type specific parameters
		if(geonType == pcl::SACMODEL_PLANE)
		{
		  seg.setNormalDistanceWeight (0.5);
		  seg.setDistanceThreshold (0.08);
		}
		if(geonType == pcl::SACMODEL_CYLINDER)
		{
		  seg.setNormalDistanceWeight (0.1);
		  seg.setDistanceThreshold (0.05);
		}

		  //perform the segmentation, aka detection
		  seg.segment (*geonIndices, *coefficients);
		  std::cerr << geonType << "coefficients: " << *coefficients << std::endl;

		  //if no geon is found, return directly.
		  if(geonIndices->indices.size()==0)
		  {
			  return;
		  }

		  //increase total number of found geons.
		  this->totalCount++;

		  // Remove the inlier, extract the rest
		  extract.setInputCloud(cloud_filtered);
		  extract.setIndices(geonIndices);
		  extract.setNegative (true);
		  extract.filter (*cloud_filtered2);

		  extract_normals.setInputCloud(cloud_normals);
		  extract_normals.setIndices(geonIndices);
		  extract_normals.setNegative (true);
		  extract_normals.filter (*cloud_normals2);


		  // Write the inliers to disk
		  pcl::PointCloud<PointT>::Ptr cloud_geon(new pcl::PointCloud<PointT> ());
		  extract.setNegative(false);
		  extract.filter (*cloud_geon);
		  std::cerr << "PointCloud representing the planar component: " << cloud_geon->points.size () << " data points." << std::endl;

		  std::stringstream geonPath;
		  geonPath << findTypeName(geonType) << "_" << totalCount  << ".pcd";

		  writer.write (geonPath.str().c_str(), *cloud_geon, false);
		 // writer.write ("geon.pcd", *cloud_geon, false);

		  //copy cloud_filtered2 to cloud_filtered
		  //pcl::copyPointCloud(*cloud_filtered2,*cloud_filtered);
		  //pcl::copyPointCloud(*cloud_normals2,*cloud_normals);

	}
Exemplo n.º 3
0
void
MFCSimpleTypeView::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	int			m_bClientWidthSel = TRUE;
	int			m_cxClient = 0;
	int			m_cxStateImageOffset = 0;
	COLORREF	m_clrText = ::GetSysColor(COLOR_WINDOWTEXT);
	COLORREF	m_clrTextBk = ::GetSysColor(COLOR_WINDOW);
	COLORREF	m_clrBkgnd = ::GetSysColor(COLOR_WINDOW);

	CListCtrl& listCtrl=GetListCtrl();
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	CRect rcItem(lpDrawItemStruct->rcItem);
	UINT uiFlags = ILD_TRANSPARENT;
	CImageList* pImageList;
	int nItem = lpDrawItemStruct->itemID;
	BOOL bFocus = (GetFocus() == this);
	COLORREF clrTextSave, clrBkSave;
	COLORREF clrImage = m_clrBkgnd;
	static _TCHAR szBuff[MAX_PATH];
	LPCTSTR pszText;

	StabEnt			*itemSym = SymForItem(nItem);
// get item data

	LV_ITEM lvi;
	lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
	lvi.iItem = nItem;
	lvi.iSubItem = 0;
	lvi.pszText = szBuff;
	lvi.cchTextMax = sizeof(szBuff);
	lvi.stateMask = 0xFFFF;     // get all state flags
	listCtrl.GetItem(&lvi);

	BOOL bSelected = (bFocus || (GetStyle() & LVS_SHOWSELALWAYS)) && lvi.state & LVIS_SELECTED;
	bSelected = bSelected || (lvi.state & LVIS_DROPHILITED);

// set colors if item is selected

	CRect rcAllLabels;
	listCtrl.GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS);

	CRect rcLabel;
	listCtrl.GetItemRect(nItem, rcLabel, LVIR_BOUNDS);
//	listCtrl.GetItemRect(nItem, rcLabel, LVIR_LABEL);

	rcAllLabels.left = rcLabel.left;
	if (m_bClientWidthSel && rcAllLabels.right<m_cxClient)
		rcAllLabels.right = m_cxClient;

	if (bSelected)	{
		clrTextSave = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
		clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));

		pDC->FillRect(rcAllLabels, &CBrush(::GetSysColor(COLOR_HIGHLIGHT)));
	}
	else
		pDC->FillRect(rcAllLabels, &CBrush(m_clrTextBk));

// set color and mask for the icon

	if (lvi.state & LVIS_CUT)	{
		clrImage = m_clrBkgnd;
		uiFlags |= ILD_BLEND50;
	}	else if (bSelected) {
		clrImage = ::GetSysColor(COLOR_HIGHLIGHT);
		uiFlags |= ILD_BLEND50;
	}

// draw state icon

	UINT nStateImageMask = lvi.state & LVIS_STATEIMAGEMASK;
	if (nStateImageMask)	{
		int nImage = (nStateImageMask>>12) - 1;
		pImageList = listCtrl.GetImageList(LVSIL_STATE);
		if (pImageList)		{
			pImageList->Draw(pDC, nImage,
				CPoint(rcItem.left, rcItem.top), ILD_TRANSPARENT);
		}
	}

// draw normal and overlay icon

/*
	CRect rcIcon;
	ListCtrl.GetItemRect(nItem, rcIcon, LVIR_ICON);

	pImageList = listCtrl.GetImageList(LVSIL_SMALL);
	if (pImageList)	{
		UINT nOvlImageMask=lvi.state & LVIS_OVERLAYMASK;
		if (rcItem.left<rcItem.right-1)		{
			ImageList_DrawEx(pImageList->m_hImageList, lvi.iImage,
					pDC->m_hDC,rcIcon.left,rcIcon.top, 16, 16,
					m_clrBkgnd, clrImage, uiFlags | nOvlImageMask);
		}
	}
*/

// draw item label

//	listCtrl.GetItemRect(nItem, rcItem, LVIR_LABEL);
	LV_COLUMN lvc;
	lvc.mask = LVCF_FMT | LVCF_WIDTH;

	listCtrl.GetItemRect(nItem, rcItem, LVIR_BOUNDS);
	listCtrl.GetColumn(0, &lvc); 

	rcItem.right = lvc.cx;

//	pszText = MakeShortString(pDC, szBuff,
//				rcItem.right-rcItem.left, 2*OFFSET_FIRST);
	pszText = szBuff;

	rcLabel = rcItem;
	rcLabel.left += OFFSET_FIRST;
	rcLabel.right -= OFFSET_FIRST;


	pDC->SetTextColor(rgb_black);
	pDC->DrawText(pszText,-1,rcLabel,DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);

// draw labels for extra columns
	if (itemSym) {
		UINT nOvlImageMask=lvi.state & LVIS_OVERLAYMASK;
// type
		listCtrl.GetColumn(1, &lvc); 
		rcItem.left = rcItem.right;
		rcItem.right += lvc.cx;

		rcLabel = rcItem;
		rcLabel.left += OFFSET_OTHER;
		rcLabel.right -= OFFSET_OTHER;

		string tnm = findTypeName(itemSym->type);
		if (tnm.size()) {
			pDC->SetTextColor(rgb_blue);
			long h = pDC->DrawText(tnm.c_str() , -1, rcLabel, DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);
		}
// length
		listCtrl.GetColumn(2, &lvc); 
		rcItem.left = rcItem.right;
		rcItem.right += lvc.cx;
//		fprintf(stderr, "%d %d %d\n", pszText, itemSym->type, lvc.cx);

		rcLabel = rcItem;
		rcLabel.left += OFFSET_OTHER;
		rcLabel.right -= OFFSET_OTHER;

		if (itemSym->indirection > 0) {
			char	buf[120];
			buf[0] = 0;
			for (short i=1; i<itemSym->indirection; i++) {
				char	nbuf[10];
				sprintf(nbuf, "%s%d", i>1?",":"",itemSym->size[i]);
				strcat(buf, nbuf);
			}
			pDC->SetTextColor(rgb_blue);
			pDC->DrawText(buf, -1, rcLabel,
				DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);
		}
// controller
		listCtrl.GetColumn(3, &lvc); 
		rcItem.left = rcItem.right;
		rcItem.right += lvc.cx;
		if (itemSym->controlMode != StabEnt::DISPLAY_NOT) {
			ImageList_DrawEx(images,
					itemSym->controlMode == StabEnt::DISPLAY_CTL ? 0 :
						itemSym->controlMode == StabEnt::DISPLAY_DISP? 2 : 0,
					pDC->m_hDC,rcItem.left,rcItem.top, 16, 16,
					m_clrBkgnd, clrImage, uiFlags | nOvlImageMask);
		}
// envelope
		listCtrl.GetColumn(4, &lvc); 
		rcItem.left = rcItem.right;
		rcItem.right += lvc.cx;
		if (itemSym->isEnveloped) {
			ImageList_DrawEx(images, 1 /* which one */,
					pDC->m_hDC,rcItem.left,rcItem.top, 16, 16,
					m_clrBkgnd, clrImage, uiFlags | nOvlImageMask);
		}
	}
/*
	for(int nColumn = 1; listCtrl.GetColumn(nColumn, &lvc); nColumn++)	{
		rcItem.left = rcItem.right;
		rcItem.right += lvc.cx;

		int nRetLen = listCtrl.GetItemText(nItem, nColumn,	szBuff, sizeof(szBuff));
		if (nRetLen == 0)
			continue;

//		pszText = MakeShortString(pDC, szBuff,
//			rcItem.right - rcItem.left, 2*OFFSET_OTHER);

		pszText = szBuff;

		UINT nJustify = DT_LEFT;

		if(pszText == szBuff) {
			switch(lvc.fmt & LVCFMT_JUSTIFYMASK) {
			case LVCFMT_RIGHT:
				nJustify = DT_RIGHT;
				break;
			case LVCFMT_CENTER:
				nJustify = DT_CENTER;
				break;
			default:
				break;
			}
		}

		rcLabel = rcItem;
		rcLabel.left += OFFSET_OTHER;
		rcLabel.right -= OFFSET_OTHER;

		pDC->DrawText(pszText, -1, rcLabel,
			nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);
	}*/

// draw focus rectangle if item has focus

	if (lvi.state & LVIS_FOCUSED && bFocus)
		pDC->DrawFocusRect(rcAllLabels);

// set original colors if item was selected

	if (bSelected) {
		pDC->SetTextColor(clrTextSave);
		pDC->SetBkColor(clrBkSave);
	}
}