Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »

The following is sample code uses ShellKey::ShowTristrips to find the vertices of a sub-face. Please run sample code using hps_mfc_sandbox.

  1. Replace CHPSView::OnUserCode2() (CHPSView.cpp) with the following code:

    class Face
    {
    public:
    	Face(unsigned int v1, unsigned int v2, unsigned int v3)
    	{
    		_v1 = v1; _v2 = v2; _v3 = v3;
    	}
    	unsigned int GetV1() { return _v1; }
    	unsigned int GetV2() { return _v2; }
    	unsigned int GetV3() { return _v3; }
    private:
    	/*unsigned int _id;*/
    	unsigned int _v1, _v2, _v3;
    };
    
    void CHPSView::OnUserCode2()
    {
    
    	HPS::SegmentKey ModelSegKey = GetDocument()->GetModel().GetSegmentKey();
    	ModelSegKey.GetPerformanceControl().SetStaticModel(HPS::Performance::StaticModel::None);
    
    	HPS::SegmentKey MarkKey = ModelSegKey.Subsegment("Vertices");
    	ModelSegKey.GetVisibilityControl().SetMarkers(true).SetEdges(true);
    	ModelSegKey.GetMaterialMappingControl().SetMarkerColor(RGBColor(1, 0, 0));
    	ModelSegKey.GetMarkerAttributeControl().SetSymbol("circle in a circle");
    
    
    	HPS::ShellKey shellKey;
    	bool found = false;
    	// Search the segment for Shell
    	// cylinder_as_shell.hsf contain only one shell
    
    	HPS::SearchResults searchResults;
    	ModelSegKey.Find(HPS::Search::Type::Shell,
    		HPS::Search::Space::Subsegments,
    		searchResults);
    	HPS::SearchResultsIterator it = searchResults.GetIterator();
    
    	while (it.IsValid())
    	{
    		Key key = it.GetItem();
    
    		if (key.Type() == HPS::Type::ShellKey)
    		{
    		
    			shellKey = (HPS::ShellKey)key;
    			found = true;
    
    		}
    		it.Next();
    	}
    
    	if (found)
    	{
    
    		HPS::SizeTArray out_faces, out_vertices, edges1, edges2;
    
    		IntArray tristrips, face_indices;
    		PointArray points;
    
    		shellKey.ShowTristrips(tristrips, face_indices);
    		shellKey.ShowPoints(points);
    
    		//  assuming each face only contain 3 vertices (tri-strip)
    		std::vector<Face> tri_strip_flist(face_indices.size(), Face(0, 0, 0));
    
    		//  Generate facelist from tristrips and face_indices
    		//  map shellface to tri_strip_flist
    
    		size_t map_index = 0;
    
    		for (int i = 0; i < tristrips.size(); i++)
    		{
    			int traverse_array = i;
    			for (int j = 0; j < tristrips[i] - 2; j++)  // generate faces
    			{
    				Face shellface(tristrips[traverse_array + j + 1], tristrips[traverse_array + j + 2], tristrips[traverse_array + j + 3]);
    
    				int face_number = face_indices[map_index++];
    				tri_strip_flist[face_number] = shellface;
    
    			}
    
    			i = i + tristrips[i];  //  increment to end of facelist
    		}
    
    		// shellface is sorted
    
    
    
    		//  Change sub-face color to red
    		//  Insert markers separately using points found on shell
    
    		tri_strip_flist.shrink_to_fit();
    		size_t numFaces = tri_strip_flist.size();
    
    		for (int x = 0; x < numFaces; x++)
    		{
    
    			size_t pointoffset1 = tri_strip_flist[x].GetV1();
    			size_t pointoffset2 = tri_strip_flist[x].GetV2();
    			size_t pointoffset3 = tri_strip_flist[x].GetV3();
    
    
    			HPS::Point p1 = points[pointoffset1];
    			HPS::Point p2 = points[pointoffset2];
    			HPS::Point p3 = points[pointoffset3];
    
    
    			RGBColorArray cols;
    			cols.push_back(HPS::RGBColor(1, 0, 0));
    
    			HPS::SizeTArray faceArrcol;
    			faceArrcol.push_back(x);
    
    			shellKey.SetFaceRGBColorsByList(faceArrcol, cols);
    
    
    			MarkKey.InsertMarker(p1);
    			MarkKey.InsertMarker(p2);
    			MarkKey.InsertMarker(p3);
    
    			GetCanvas().UpdateWithNotifier().Wait();
    
    
                
      			// Flush everything
    			MarkKey.Flush();
    			shellKey.UnsetFaceColors();
    
    
    
    		}
    	}
    }
  2. Build and run hps_mfc_sandbox

  3. Load cylinder_as_shell.hsf

  4. Run OnUserCode2

 

  • No labels