Search in sources :

Example 6 with Surface

use of cbit.vcell.geometry.surface.Surface in project vcell by virtualcell.

the class CartesianMesh method createSimpleCartesianMesh.

public static CartesianMesh createSimpleCartesianMesh(Geometry geometry, Map<Polygon, MembraneElement> polygonMembaneElementMap) throws IOException, MathFormatException {
    GeometrySurfaceDescription geometrySurfaceDescription = geometry.getGeometrySurfaceDescription();
    RegionImage regionImage = geometrySurfaceDescription.getRegionImage();
    ISize iSize = new ISize(regionImage.getNumX(), regionImage.getNumY(), regionImage.getNumZ());
    CartesianMesh mesh = createSimpleCartesianMesh(geometry.getOrigin(), geometry.getExtent(), iSize, regionImage);
    GeometricRegion[] geometricRegions = geometrySurfaceDescription.getGeometricRegions();
    if (geometricRegions != null) {
        int memRegionCount = 0;
        for (int i = 0; i < geometricRegions.length; i++) {
            if (geometricRegions[i] instanceof VolumeGeometricRegion) {
                VolumeGeometricRegion vgr = (VolumeGeometricRegion) geometricRegions[i];
                mesh.meshRegionInfo.mapVolumeRegionToSubvolume(vgr.getRegionID(), vgr.getSubVolume().getHandle(), vgr.getSize(), vgr.getName());
            } else if (geometricRegions[i] instanceof SurfaceGeometricRegion) {
                SurfaceGeometricRegion sgr = (SurfaceGeometricRegion) geometricRegions[i];
                GeometricRegion[] neighbors = sgr.getAdjacentGeometricRegions();
                VolumeGeometricRegion insideRegion = (VolumeGeometricRegion) neighbors[0];
                VolumeGeometricRegion outsideRegion = (VolumeGeometricRegion) neighbors[1];
                mesh.meshRegionInfo.mapMembraneRegionToVolumeRegion(memRegionCount, insideRegion.getRegionID(), outsideRegion.getRegionID(), sgr.getSize());
                memRegionCount++;
            }
        }
    }
    SurfaceCollection surfaceCollection = geometrySurfaceDescription.getSurfaceCollection();
    if (surfaceCollection != null) {
        int numMembraneElement = surfaceCollection.getTotalPolygonCount();
        mesh.membraneElements = new MembraneElement[numMembraneElement];
        boolean bMembraneEdgeNeighborsAvailable = surfaceCollection.getMembraneEdgeNeighbors() != null && surfaceCollection.getMembraneEdgeNeighbors().length == surfaceCollection.getSurfaceCount();
        int[] membraneElementMapMembraneRegion = new int[numMembraneElement];
        mesh.meshRegionInfo.mapMembraneElementsToMembraneRegions(membraneElementMapMembraneRegion);
        int memCount = 0;
        // original values when no membraneedgeneighbors
        int[] membraneNeighbors = new int[] { 0, 0, 0, 0 };
        for (int i = 0; i < surfaceCollection.getSurfaceCount(); i++) {
            Surface surface = surfaceCollection.getSurfaces(i);
            bMembraneEdgeNeighborsAvailable = bMembraneEdgeNeighborsAvailable && surfaceCollection.getMembraneEdgeNeighbors()[i].length == surface.getPolygonCount();
            for (int j = 0; j < surface.getPolygonCount(); j++) {
                if (bMembraneEdgeNeighborsAvailable) {
                    membraneNeighbors = new int[MembraneElement.MAX_POSSIBLE_NEIGHBORS];
                    Arrays.fill(membraneNeighbors, MembraneElement.NEIGHBOR_UNDEFINED);
                    for (int k = 0; k < surfaceCollection.getMembraneEdgeNeighbors()[i][j].size(); k++) {
                        membraneNeighbors[k] = surfaceCollection.getMembraneEdgeNeighbors()[i][j].get(k).getMasterPolygonIndex();
                    }
                }
                Quadrilateral polygon = (Quadrilateral) surface.getPolygons(j);
                int volNeighbor1Region = regionImage.getRegionInfoFromOffset(polygon.getVolIndexNeighbor1()).getRegionIndex();
                int volNeighbor2Region = regionImage.getRegionInfoFromOffset(polygon.getVolIndexNeighbor2()).getRegionIndex();
                HashMap<Integer, int[]> map = mesh.getMembraneRegionMapSubvolumesInOut();
                Set<Entry<Integer, int[]>> entries = map.entrySet();
                for (Entry<Integer, int[]> entry : entries) {
                    int[] volNeighbors = entry.getValue();
                    if (volNeighbors[0] == volNeighbor1Region && volNeighbors[1] == volNeighbor2Region || volNeighbors[1] == volNeighbor1Region && volNeighbors[0] == volNeighbor2Region) {
                        membraneElementMapMembraneRegion[memCount] = entry.getKey();
                        break;
                    }
                }
                mesh.membraneElements[memCount] = new MembraneElement(memCount, polygon.getVolIndexNeighbor1(), polygon.getVolIndexNeighbor2(), membraneNeighbors[0], membraneNeighbors[1], membraneNeighbors[2], membraneNeighbors[3], MembraneElement.AREA_UNDEFINED, 0, 0, 0, 0, 0, 0);
                if (polygonMembaneElementMap != null) {
                    polygonMembaneElementMap.put(polygon, mesh.membraneElements[memCount]);
                }
                memCount++;
            }
        }
    }
    return mesh;
}
Also used : SurfaceCollection(cbit.vcell.geometry.surface.SurfaceCollection) GeometrySurfaceDescription(cbit.vcell.geometry.surface.GeometrySurfaceDescription) ISize(org.vcell.util.ISize) VolumeGeometricRegion(cbit.vcell.geometry.surface.VolumeGeometricRegion) VolumeGeometricRegion(cbit.vcell.geometry.surface.VolumeGeometricRegion) SurfaceGeometricRegion(cbit.vcell.geometry.surface.SurfaceGeometricRegion) GeometricRegion(cbit.vcell.geometry.surface.GeometricRegion) Surface(cbit.vcell.geometry.surface.Surface) Quadrilateral(cbit.vcell.geometry.surface.Quadrilateral) Entry(java.util.Map.Entry) RegionImage(cbit.vcell.geometry.RegionImage) SurfaceGeometricRegion(cbit.vcell.geometry.surface.SurfaceGeometricRegion)

Example 7 with Surface

use of cbit.vcell.geometry.surface.Surface in project vcell by virtualcell.

the class ROIMultiPaintManager method getImportSTLtasks.

// private File lastImportDir;
private ArrayList<AsynchClientTask> getImportSTLtasks(File[] selectedFiles, Vect3d primarySampleSizes, Vect3d subSampleOffset) {
    // try {
    final RegionImage currRegionImage = regionImage;
    final TreeMap<Integer, String> newROIindexes = new TreeMap<>();
    final TreeMap<BoundingBox, Object[]> regionBounds = new TreeMap<>(new Comparator<BoundingBox>() {

        @Override
        public int compare(BoundingBox arg0, BoundingBox arg1) {
            if (arg1 == arg0) {
                return 0;
            }
            if (arg0.getLoX() == arg1.getLoX() && arg0.getLoY() == arg1.getLoY() && arg0.getLoZ() == arg1.getLoZ() && arg0.getHiX() == arg1.getHiX() && arg0.getHiY() == arg1.getHiY() && arg0.getHiZ() == arg1.getHiZ()) {
                return 0;
            }
            return (arg0.getLoX() >= arg1.getLoX() && arg0.getLoY() >= arg1.getLoY() && arg0.getLoZ() >= arg1.getLoZ() && arg0.getHiX() <= arg1.getHiX() && arg0.getHiY() <= arg1.getHiY() && arg0.getHiZ() <= arg1.getHiZ() ? -1 : +1);
        }
    });
    AsynchClientTask sampleSTLtask = new AsynchClientTask("importSTLtask", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {

        @Override
        public void run(Hashtable<String, Object> hashTable) throws Exception {
            StatsHelper statsHelper = calcMinMax(selectedFiles);
            Vect3d worldOrigin = new Vect3d(statsHelper.xmin, statsHelper.ymin, statsHelper.zmin);
            Vect3d worldCollapsedBoundingBox = new Vect3d(statsHelper.xmax - statsHelper.xmin, statsHelper.ymax - statsHelper.ymin, statsHelper.zmax - statsHelper.zmin);
            Vect3d scale = new Vect3d(worldCollapsedBoundingBox.getX() / (2.0 * primarySampleSizes.getX()), worldCollapsedBoundingBox.getY() / (2.0 * primarySampleSizes.getY()), worldCollapsedBoundingBox.getZ() / (2.0 * primarySampleSizes.getZ()));
            // }
            if (scale.getX() != 0 && scale.getX() <= (scale.getY() == 0 ? scale.getX() : scale.getY()) && scale.getX() <= (scale.getZ() == 0 ? scale.getX() : scale.getZ())) {
                scale = new Vect3d(scale.getX(), scale.getX(), scale.getX());
            } else if (scale.getY() != 0 && scale.getY() <= (scale.getX() == 0 ? scale.getY() : scale.getX()) && scale.getY() <= (scale.getZ() == 0 ? scale.getY() : scale.getZ())) {
                scale = new Vect3d(scale.getY(), scale.getY(), scale.getY());
            } else if (scale.getZ() != 0 && scale.getZ() <= (scale.getY() == 0 ? scale.getZ() : scale.getY()) && scale.getZ() <= (scale.getX() == 0 ? scale.getZ() : scale.getX())) {
                scale = new Vect3d(scale.getZ(), scale.getZ(), scale.getZ());
            }
            for (int j = 0; j < selectedFiles.length; j++) {
                // ClientRequestManager.createSurfaceCollectionFromSurfaceFile(selectedFile);
                SurfaceCollection surfaceCollection = statsHelper.recalSurfs.get(j);
                for (int i = 0; i < surfaceCollection.getSurfaceCount(); i++) {
                    Surface surface = surfaceCollection.getSurfaces(i);
                    // System.out.println("surface "+i);
                    // Vect3d xyzLow = new Vect3d(surface.getPolygons(0).getNodes(0).getX(),surface.getPolygons(0).getNodes(1).getX(),surface.getPolygons(0).getNodes(2).getX());
                    // Vect3d xyzHigh = new Vect3d(xyzLow);
                    ComboboxROIName[] existingRoiNames = overlayEditorPanelJAI.getAllCompositeROINamesAndColors();
                    int newIndex = getUnusedROIColorIndex(existingRoiNames, newROIindexes.keySet());
                    newROIindexes.put(newIndex, selectedFiles[j].getName());
                    byte value = (byte) newIndex;
                    // overlayEditorPanelJAI.addROIName(roiName, true, roiName, true, value);
                    for (int k = 0; k < surface.getPolygonCount(); k++) {
                        Polygon polygon = surface.getPolygons(k);
                        // for (Node pnode:polygon.getNodes()) {
                        // xyzLow.set(Math.min(xyzLow.getX(), pnode.getX()),Math.min(xyzLow.getY(), pnode.getY()),Math.min(xyzLow.getZ(), pnode.getZ()));
                        // xyzHigh.set(Math.max(xyzHigh.getX(), pnode.getX()),Math.max(xyzHigh.getY(), pnode.getY()),Math.max(xyzHigh.getZ(), pnode.getZ()));
                        // }
                        // if(k%10000 == 0){
                        // System.out.println("progress= file "+(j+1)+" of "+selectedFiles.length+" "+((k*100)/surface.getPolygonCount())+"%");
                        // }
                        // System.out.println("  polygon "+j+" "+polygon.getNodes(0)+" "+polygon.getNodes(1)+" "+polygon.getNodes(2));
                        Vect3d line1 = new Vect3d(polygon.getNodes(0));
                        Vect3d end1 = new Vect3d(polygon.getNodes(2));
                        Vect3d incr1 = Vect3d.sub(end1, line1);
                        incr1.unit();
                        incr1.set(incr1.getX() * scale.getX(), incr1.getY() * scale.getY(), incr1.getZ() * scale.getZ());
                        Vect3d line2 = new Vect3d(line1);
                        Vect3d end2 = new Vect3d(polygon.getNodes(1));
                        Vect3d incr2 = Vect3d.sub(end2, line2);
                        incr2.unit();
                        incr2.set(incr2.getX() * scale.getX(), incr2.getY() * scale.getY(), incr2.getZ() * scale.getZ());
                        while (true) {
                            Vect3d line3 = new Vect3d(line1);
                            Vect3d end3 = new Vect3d(line2);
                            Vect3d incr3 = Vect3d.sub(end3, line3);
                            if (incr3.length() != 0) {
                                incr3.unit();
                                incr3.set(incr3.getX() * scale.getX(), incr3.getY() * scale.getY(), incr3.getZ() * scale.getZ());
                            }
                            while (true) {
                                calcXYZ(line3, worldOrigin, worldCollapsedBoundingBox, primarySampleSizes, subSampleOffset, value);
                                line3.add(incr3);
                                Vect3d check = Vect3d.sub(end3, line3);
                                if ((check.length() == 0) || Math.signum(check.getX()) != Math.signum(incr3.getX()) || Math.signum(check.getY()) != Math.signum(incr3.getY()) || Math.signum(check.getZ()) != Math.signum(incr3.getZ())) {
                                    calcXYZ(end3, worldOrigin, worldCollapsedBoundingBox, primarySampleSizes, subSampleOffset, value);
                                    break;
                                }
                            }
                            if (line1.equals(end1) && line2.equals(end2)) {
                                break;
                            }
                            line1.add(incr1);
                            Vect3d check = Vect3d.sub(end1, line1);
                            if (check.length() == 0 || Math.signum(check.getX()) != Math.signum(incr1.getX()) || Math.signum(check.getY()) != Math.signum(incr1.getY()) || Math.signum(check.getZ()) != Math.signum(incr1.getZ())) {
                                line1 = new Vect3d(end1);
                            }
                            line2.add(incr2);
                            check = Vect3d.sub(end2, line2);
                            if (check.length() == 0 || Math.signum(check.getX()) != Math.signum(incr2.getX()) || Math.signum(check.getY()) != Math.signum(incr2.getY()) || Math.signum(check.getZ()) != Math.signum(incr2.getZ())) {
                                line2 = new Vect3d(end2);
                            }
                        }
                    }
                // regionBounds.put(new BoundingBox(xyzLow.getX(), xyzHigh.getX(),xyzLow.getY(), xyzHigh.getY(),xyzLow.getZ(), xyzHigh.getZ()),new Object[] {new int[] {j,i},roiName});
                }
            }
            // for(BoundingBox bb:regionBounds.keySet()){
            // System.out.println(((int[])regionBounds.get(bb)[0])[0]+","+((int[])regionBounds.get(bb)[0])[1]+" name="+((String)regionBounds.get(bb)[1])+" bound="+bb.getLoX()+","+bb.getHiX()+" "+bb.getLoY()+","+bb.getHiY()+" "+bb.getLoZ()+","+bb.getHiZ());
            // }
            updateAuxiliaryInfo(originalISize, getClientTaskStatusSupport());
        // }
        }
    };
    final int[] checkHolder = new int[1];
    final String[] cleanupHolder = new String[1];
    final String YES = "Yes";
    final ComboboxROIName[] cbxHolder = new ComboboxROIName[1];
    final String CHECK = "check";
    AsynchClientTask addROInamesTask = new AsynchClientTask("Add new ROI names...", AsynchClientTask.TASKTYPE_SWING_BLOCKING) {

        @Override
        public void run(Hashtable<String, Object> hashTable) throws Exception {
            int i = 0;
            for (Integer newIndex : newROIindexes.keySet()) {
                String roiName = FilenameUtils.getBaseName(newROIindexes.get(newIndex));
                roiName = TokenMangler.fixTokenStrict(roiName, 6);
                roiName += "_" + i++;
                overlayEditorPanelJAI.addROIName(roiName, true, roiName, true, newIndex);
            }
            cleanupHolder[0] = DialogUtils.showWarningDialog(overlayEditorPanelJAI, "Cleanup imported geometry?", new String[] { YES, "No" }, YES);
            if (!YES.equals(cleanupHolder[0])) {
                return;
            }
            checkHolder[0] = getUnusedROIColorIndex(overlayEditorPanelJAI.getAllCompositeROINamesAndColors(), null);
            overlayEditorPanelJAI.addROIName(CHECK, true, CHECK, true, checkHolder[0]);
            ComboboxROIName[] temp = overlayEditorPanelJAI.getAllCompositeROINamesAndColors();
            for (ComboboxROIName cbx : temp) {
                if (cbx.getROIName().equals(CHECK)) {
                    cbxHolder[0] = cbx;
                    break;
                }
            }
        }
    };
    // AsynchClientTask removeCheckROI = new AsynchClientTask("Remove check...",AsynchClientTask.TASKTYPE_SWING_BLOCKING) {
    // 
    // @Override
    // public void run(Hashtable<String, Object> hashTable) throws Exception {
    // ComboboxROIName[] regNames = overlayEditorPanelJAI.getAllCompositeROINamesAndColors();
    // for(ComboboxROIName cbx:regNames){
    // if(cbx.get)
    // }
    // }
    // };
    final AsynchClientTask mergeBackgroundRegions = new AsynchClientTask("Merge background regions...", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {

        @Override
        public void run(Hashtable<String, Object> hashTable) throws Exception {
            if (!YES.equals(cleanupHolder[0])) {
                return;
            }
            // long start = System.currentTimeMillis();
            // while(currRegionImage == regionImage){
            // int dur = (int)((System.currentTimeMillis()-start)/1000);
            // if(dur > 10){
            // return;
            // }
            // System.out.println("trying..."+dur);
            // Thread.sleep(1000);
            // }
            final TreeMap<RegionInfo, Vect3d[]> regTobb = new TreeMap<>(new Comparator<RegionInfo>() {

                @Override
                public int compare(RegionInfo arg0, RegionInfo arg1) {
                    return arg0.getRegionIndex() - arg1.getRegionIndex();
                }
            });
            Hashtable<String, Object> newRegionImgHolder = new Hashtable<>();
            createRegionImageTask.run(newRegionImgHolder);
            RegionImage newRegionImage = (RegionImage) newRegionImgHolder.get(LOCAL_REGION_IMAGE);
            // ArrayList<RegionInfo> remainingRegionInfos = new ArrayList<>(Arrays.asList(newRegionImage.getRegionInfos()));
            // BoundingBox bb = new BoundingBox(0, newRegionImage.getNumX()-1, 0, newRegionImage.getNumY()-1, 0, newRegionImage.getNumZ()-1);
            // int currIndex = 0;
            // for (int z = 0; z <= bb.getHiZ(); z++) {
            // for (int y = 0; y <= bb.getHiY(); y++) {
            // for (int x = 0; x <= bb.getHiX(); x++) {
            // ArrayList<RegionInfo> tempRegionInfos = (ArrayList<RegionInfo>)remainingRegionInfos.clone();
            // if(x==0 || x == bb.getHiX() || y==0 || y == bb.getHiY() || z==0 || z == bb.getHiZ()){
            // for(RegionInfo reg:tempRegionInfos){
            // if(reg.getPixelValue() == 0 && reg.isIndexInRegion(currIndex)){
            // remainingRegionInfos.remove(reg);
            // break;
            // }
            // }
            // }else{
            // for(RegionInfo reg:tempRegionInfos){
            // if(reg.getPixelValue() == 0 && reg.isIndexInRegion(currIndex)){
            // remainingRegionInfos.remove(reg);
            // break;
            // }
            // }
            // }
            // currIndex++;
            // }
            // }
            // }
            // Remove unfilled regions (background) that touch the whole region border
            int allPixCnt = 0;
            ArrayList<RegionInfo> excluded = new ArrayList<>();
            for (int z = 0; z < newRegionImage.getNumZ(); z++) {
                for (int y = 0; y < newRegionImage.getNumY(); y++) {
                    for (int x = 0; x < newRegionImage.getNumX(); x++) {
                        RegionInfo regInfo = newRegionImage.getRegionInfoFromOffset(allPixCnt);
                        allPixCnt += 1;
                        if (excluded.contains(regInfo)) {
                            continue;
                        }
                        if (regInfo.getPixelValue() == 0 && (x == 0 || x == newRegionImage.getNumX() - 1 || y == 0 || y == newRegionImage.getNumY() - 1 || z == 0 || z == newRegionImage.getNumZ() - 1)) {
                            excluded.add(regInfo);
                            if (regTobb.containsKey(regInfo)) {
                                regTobb.remove(regInfo);
                            }
                            continue;
                        }
                        Vect3d[] bounds = regTobb.get(regInfo);
                        if (bounds == null) {
                            bounds = new Vect3d[] { new Vect3d(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY), new Vect3d(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY) };
                            regTobb.put(regInfo, bounds);
                        }
                        bounds[0].set(Math.min(bounds[0].getX(), x), Math.min(bounds[0].getY(), y), Math.min(bounds[0].getZ(), z));
                        bounds[1].set(Math.max(bounds[1].getX(), x), Math.max(bounds[1].getY(), y), Math.max(bounds[1].getZ(), z));
                    }
                }
            }
            // ArrayList<Object[]> tree = new ArrayList<>();//arraylist<object[]>,regionInfo
            // ArrayList<RegionInfo> bucket = new ArrayList<>(regTobb.keySet());
            // tree.add(new Object[] {null,regTobb.firstKey()});
            // //				ArrayList<Object[]> stack = new ArrayList<>();
            // //				stack.add(tree.get(0));
            // while(bucket.size() > 0){
            // //					Object[] next = stack.remove(0);
            // RegionInfo next = bucket.remove(0);
            // Vect3d[] o2v = (Vect3d[])regTobb.get(regTobb.get(next));
            // for(Object[] objArr:tree){
            // //						if(((RegionInfo)next[1]).getRegionIndex() != reg.getRegionIndex()){
            // //								for(RegionInfo bucketReg:bucket){
            // Vect3d[] o1v = (Vect3d[])regTobb.get(objArr[1]);
            // if(	o1v[0].getX() >= o2v[0].getX() && o1v[0].getX() <= o2v[1].getX() &&
            // o1v[0].getY() >= o2v[0].getY() && o1v[0].getY() <= o2v[1].getY() &&
            // o1v[0].getZ() >= o2v[0].getZ() && o1v[0].getZ() <= o2v[1].getZ()
            // ){
            // 
            // }
            // //								}
            // //						}
            // }
            // }
            // Sort filled/unfilled regions by boundingbox
            ArrayList<RegionInfo> sortedRegionInfos = new ArrayList<>(Arrays.asList(regTobb.keySet().toArray(new RegionInfo[0])));
            Collections.sort(sortedRegionInfos, new Comparator<RegionInfo>() {

                @Override
                public int compare(RegionInfo o1, RegionInfo o2) {
                    Vect3d[] o1v = (Vect3d[]) regTobb.get(o1);
                    Vect3d[] o2v = (Vect3d[]) regTobb.get(o2);
                    // }
                    if (o1v[0].getX() == o2v[0].getX() && o1v[1].getX() == o2v[1].getX() && o1v[0].getY() == o2v[0].getY() && o1v[1].getY() == o2v[1].getY() && o1v[0].getZ() >= o2v[0].getZ() && o1v[1].getZ() == o2v[1].getZ()) {
                        System.out.println(o1.getRegionIndex() + " == " + o2.getRegionIndex());
                        return 0;
                    } else if (o1v[0].getX() >= o2v[0].getX() && o1v[0].getX() <= o2v[1].getX() && // o1v[1].getX() >= o2v[0].getX() && o1v[1].getX() <= o2v[1].getX() &&
                    o1v[0].getY() >= o2v[0].getY() && o1v[0].getY() <= o2v[1].getY() && // o1v[1].getY() >= o2v[0].getY() && o1v[1].getY() <= o2v[1].getY() &&
                    o1v[0].getZ() >= o2v[0].getZ() && o1v[0].getZ() <= o2v[1].getZ()) // && o1v[1].getZ() >= o2v[0].getZ() && o1v[1].getZ() <= o2v[1].getZ()
                    {
                        System.out.println(o1.getRegionIndex() + " > " + o2.getRegionIndex());
                        return 1;
                    } else if (o1v[0].getX() <= o2v[0].getX() && o1v[1].getX() >= o2v[1].getX() && o1v[0].getY() <= o2v[0].getY() && o1v[1].getY() >= o2v[1].getY() && o1v[0].getZ() <= o2v[0].getZ() && o1v[1].getZ() >= o2v[1].getZ()) // (o1v[0].getX() < o2v[0].getX() && o1v[1].getX() < o2v[0].getX()) ||
                    // (o1v[0].getX() > o2v[1].getX() && o1v[1].getX() > o2v[1].getX()) ||
                    // 
                    // (o1v[0].getY() < o2v[0].getY() && o1v[1].getY() < o2v[0].getY()) ||
                    // (o1v[0].getY() > o2v[1].getY() && o1v[1].getY() > o2v[1].getY()) ||
                    // 
                    // (o1v[0].getZ() < o2v[0].getZ() && o1v[1].getZ() < o2v[0].getZ()) ||
                    // (o1v[0].getZ() > o2v[1].getZ() && o1v[1].getZ() > o2v[1].getZ())
                    // 
                    // /*	(o1v[0].getX() < o2v[0].getX() && o1v[0].getX() > o2v[1].getX() &&
                    // o1v[1].getX() < o2v[0].getX() && o1v[1].getX() > o2v[1].getX()) ||
                    // (o1v[0].getY() < o2v[0].getY() && o1v[0].getY() > o2v[1].getY() &&
                    // o1v[1].getY() < o2v[0].getY() && o1v[1].getY() > o2v[1].getY()) ||
                    // (o1v[0].getZ() < o2v[0].getZ() && o1v[0].getZ() > o2v[1].getZ() &&
                    // o1v[1].getZ() < o2v[0].getZ() && o1v[1].getZ() > o2v[1].getZ())*/
                    {
                        System.out.println(o1.getRegionIndex() + " <a " + o2.getRegionIndex());
                        return -1;
                    } else if ((o1v[0].getX() < o2v[0].getX() && o1v[1].getX() < o2v[0].getX()) || (o1v[0].getX() > o2v[1].getX() && o1v[1].getX() > o2v[1].getX()) || (o1v[0].getY() < o2v[0].getY() && o1v[1].getY() < o2v[0].getY()) || (o1v[0].getY() > o2v[1].getY() && o1v[1].getY() > o2v[1].getY()) || (o1v[0].getZ() < o2v[0].getZ() && o1v[1].getZ() < o2v[0].getZ()) || (o1v[0].getZ() > o2v[1].getZ() && o1v[1].getZ() > o2v[1].getZ())) {
                        System.out.println(o1.getRegionIndex() + " <b " + o2.getRegionIndex());
                        return -1;
                    }
                    System.out.println("inconclusive " + o1.getRegionIndex() + " == " + o2.getRegionIndex());
                    return 0;
                // System.out.println("inconclusive "+o1.getRegionIndex()+" "+(o1.getNumPixels() - o2.getNumPixels()<0?"<":(o1.getNumPixels() - o2.getNumPixels()>0?">":"=="))+" "+o2.getRegionIndex());
                // return o1.getNumPixels() - o2.getNumPixels();
                // System.out.println("inconclusive "+o1.getRegionIndex()+" "+(o1.getRegionIndex()-o2.getRegionIndex()<0?"<":(o1.getRegionIndex()-o2.getRegionIndex()>0?">":"=="))+" "+o2.getRegionIndex());
                // return o1.getRegionIndex()-o2.getRegionIndex();
                // if(o1v[0].getZ() != o2v[0].getZ()){
                // return (int)(o1v[0].getZ() - o2v[0].getZ());
                // }else if(o1v[0].getY() != o2v[0].getY()){
                // return (int)(o1v[0].getY() - o2v[0].getY());
                // }else if(o1v[0].getX() != o2v[0].getX()){
                // return (int)(o1v[0].getX() - o2v[0].getX());
                // }else
                // return 0;
                }
            });
            // Convert unfilled regions into parent regions
            int currColorIndex = -1;
            // for (int i = sortedRegionInfos.size()-1; i >= 0; i--) {
            for (int i = 0; i < sortedRegionInfos.size(); i++) {
                RegionInfo regInfo = sortedRegionInfos.get(i);
                Vect3d[] o1v = (Vect3d[]) regTobb.get(regInfo);
                ComboboxROIName cbxroiName = overlayEditorPanelJAI.getComboboxROIName(regInfo);
                // System.out.println(cbxroiName+" colorIndex="+regInfo.getPixelValue()+" regIndex="+regInfo.getRegionIndex()+" pixels="+regInfo.getNumPixels()+" "+o1v[0]+" "+o1v[1]);
                if (cbxroiName != null) {
                    currColorIndex = cbxroiName.getContrastColorIndex();
                    continue;
                }
                allPixCnt = 0;
                for (int z = 0; z < newRegionImage.getNumZ(); z++) {
                    for (int y = 0; y < newRegionImage.getNumY(); y++) {
                        for (int x = 0; x < newRegionImage.getNumX(); x++) {
                            if (regInfo.isIndexInRegion(allPixCnt)) {
                                BufferedImage plane = roiComposite[z];
                                byte[] data = ((DataBufferByte) plane.getRaster().getDataBuffer()).getData();
                                data[x + (plane.getWidth() * y)] = (byte) currColorIndex;
                            }
                            allPixCnt++;
                        }
                    }
                }
            }
            // for(RegionInfo regInfo:regTobb.keySet()){
            // Vect3d[] varr = regTobb.get(regInfo);
            // ComboboxROIName cbxroiName = overlayEditorPanelJAI.getComboboxROIName(regInfo);
            // regionBounds.put(new BoundingBox(varr[0].getX(), varr[1].getX(),varr[0].getY(), varr[1].getY(),varr[0].getZ(), varr[1].getZ()),new Object[] {cbxroiName});
            // }
            // for(BoundingBox bb:regionBounds.keySet()){
            // ComboboxROIName cbxroiName = ((ComboboxROIName)regionBounds.get(bb)[0]);
            // System.out.println(cbxroiName+" bound="+bb.getLoX()+","+bb.getHiX()+" "+bb.getLoY()+","+bb.getHiY()+" "+bb.getLoZ()+","+bb.getHiZ());
            // 
            // }
            // Make sure every pixel has only 1 kind of neighbor
            // createRegionImageTask.run(newRegionImgHolder);
            // newRegionImage = (RegionImage)newRegionImgHolder.get(LOCAL_REGION_IMAGE);
            boolean bHasCheck = false;
            VCImage checkImage = ROIMultiPaintManager.createVCImageFromBufferedImages(ROIMultiPaintManager.DEFAULT_EXTENT, roiComposite);
            newRegionImage = new RegionImage(checkImage, 0, /*0 means generate no surfacecollection*/
            checkImage.getExtent(), ROIMultiPaintManager.DEFAULT_ORIGIN, RegionImage.NO_SMOOTHING, null);
            TreeSet<Integer> diffNeighbors = new TreeSet<>();
            int[][] offsets = new int[][] { { -1, 0, 0 }, { 1, 0, 0 }, { 0, -1, 0 }, { 0, 1, 0 }, { 0, 0, -1 }, { 0, 0, 1 } };
            for (int z = 0; z < newRegionImage.getNumZ(); z++) {
                BufferedImage plane = roiComposite[z];
                byte[] data = ((DataBufferByte) plane.getRaster().getDataBuffer()).getData();
                allPixCnt = 0;
                for (int y = 0; y < newRegionImage.getNumY(); y++) {
                    for (int x = 0; x < newRegionImage.getNumX(); x++) {
                        diffNeighbors.clear();
                        RegionInfo regInfo = newRegionImage.getRegionInfoFromOffset(allPixCnt);
                        if (regInfo.getPixelValue() == 0) {
                            allPixCnt++;
                            continue;
                        }
                        if (x == 19 && y == 15) {
                            System.out.println("here");
                        }
                        for (int i = 0; i < offsets.length; i++) {
                            int tmpx = offsets[i][0] + x;
                            if (tmpx < 0 || tmpx >= newRegionImage.getNumX()) {
                                continue;
                            }
                            int tmpy = offsets[i][1] + y;
                            if (tmpy < 0 || tmpy >= newRegionImage.getNumY()) {
                                continue;
                            }
                            int tmpz = offsets[i][2] + z;
                            if (tmpz < 0 || tmpz >= newRegionImage.getNumZ()) {
                                continue;
                            }
                            BufferedImage plane0 = roiComposite[tmpz];
                            byte[] data0 = ((DataBufferByte) plane.getRaster().getDataBuffer()).getData();
                            byte shiftb = data0[tmpx + (tmpy * newRegionImage.getNumX())];
                            if (shiftb != regInfo.getPixelValue()) {
                                diffNeighbors.add(0x000000FF & shiftb);
                            }
                        }
                        // for (int z0 = -1; z0 <= 1; z0+=2) {
                        // int tmpz = z+z0;
                        // if(tmpz < 0 || tmpz >= newRegionImage.getNumZ()){
                        // continue;
                        // }
                        // //								tmpz = allPixCnt+(z0*newRegionImage.getNumXY());
                        // BufferedImage plane0 = roiComposite[z+z0];
                        // byte[] data0 = ((DataBufferByte)plane.getRaster().getDataBuffer()).getData();
                        // for (int y0 = -1; y0 <= 1; y0+=2) {
                        // int tmpy = y+y0;
                        // if(tmpy < 0 || tmpy >= newRegionImage.getNumY()){
                        // continue;
                        // }
                        // //									tmpy = tmpz+(y0*newRegionImage.getNumX());
                        // for (int x0 = -1; x0 <= 1; x0+=2) {
                        // int tmpx = x+x0;
                        // if(tmpx < 0 || tmpx >= newRegionImage.getNumX()){
                        // continue;
                        // }
                        // //										tmpx = tmpy+(x0);
                        // byte shiftb = data0[tmpx+(tmpy*newRegionImage.getNumX())];
                        // if(shiftb != regInfo.getPixelValue()){
                        // diffNeighbors.add(0x000000FF&shiftb);
                        // }
                        // }
                        // }
                        // }
                        allPixCnt++;
                        if (diffNeighbors.size() > 1) {
                            bHasCheck = true;
                            data[x + y * newRegionImage.getNumX()] = (byte) checkHolder[0];
                        }
                    }
                }
            }
            if (!bHasCheck && cbxHolder[0] != null) {
                SwingUtilities.invokeAndWait(new Runnable() {

                    @Override
                    public void run() {
                        overlayEditorPanelJAI.deleteROIName(cbxHolder[0]);
                    }
                });
            }
        }
    };
    // }).start();
    return new ArrayList<>(Arrays.asList(new AsynchClientTask[] { sampleSTLtask, addROInamesTask, mergeBackgroundRegions, getUpdateDisplayAfterCropTask() }));
// JFileChooser importJFC = new JFileChooser(ClientRequestManager.getPreferredPath(UserPreferences.getLastUserPreferences()));
// importJFC.setDialogTitle("Choose .stl file to import");
// importJFC.setMultiSelectionEnabled(true);
// int result = importJFC.showOpenDialog(overlayEditorPanelJAI);
// if(result == JFileChooser.APPROVE_OPTION){
// File[] selectedFiles = importJFC.getSelectedFiles();
// if(statsHelper == null){
// statsHelper = calcMinMax(selectedFiles);
// }
// ClientRequestManager.setPreferredPath(UserPreferences.getLastUserPreferences(), selectedFiles[0]);
// 
// Vect3d worldOrigin = new Vect3d(statsHelper.xmin, statsHelper.ymin, statsHelper.zmin);
// Vect3d worldCollapsedBoundingBox = new Vect3d(statsHelper.xmax-statsHelper.xmin, statsHelper.ymax-statsHelper.ymin, statsHelper.zmax-statsHelper.zmin);
// Vect3d scale = new Vect3d(worldCollapsedBoundingBox.getX()/(2.0*primarySampleSizes.getX()), worldCollapsedBoundingBox.getY()/(2.0*primarySampleSizes.getY()), worldCollapsedBoundingBox.getZ()/(2.0*primarySampleSizes.getZ()));
// //				if(scale.getX() !=0 && scale.getX() >= (scale.getY()==0?scale.getX():scale.getY()) && scale.getX() >= (scale.getZ()==0?scale.getX():scale.getZ())){
// //					scale = new Vect3d(scale.getX(), scale.getX(), scale.getX());
// //				}else if(scale.getY() !=0 && scale.getY() >= (scale.getX()==0?scale.getY():scale.getX()) && scale.getY() >= (scale.getZ()==0?scale.getY():scale.getZ())){
// //					scale = new Vect3d(scale.getY(), scale.getY(), scale.getY());
// //				}else if(scale.getZ() !=0 && scale.getZ() >= (scale.getY()==0?scale.getZ():scale.getY()) && scale.getZ() >= (scale.getX()==0?scale.getZ():scale.getX())){
// //					scale = new Vect3d(scale.getZ(), scale.getZ(), scale.getZ());
// //				}
// if(scale.getX() !=0 && scale.getX() <= (scale.getY()==0?scale.getX():scale.getY()) && scale.getX() <= (scale.getZ()==0?scale.getX():scale.getZ())){
// scale = new Vect3d(scale.getX(), scale.getX(), scale.getX());
// }else if(scale.getY() !=0 && scale.getY() <= (scale.getX()==0?scale.getY():scale.getX()) && scale.getY() <= (scale.getZ()==0?scale.getY():scale.getZ())){
// scale = new Vect3d(scale.getY(), scale.getY(), scale.getY());
// }else if(scale.getZ() !=0 && scale.getZ() <= (scale.getY()==0?scale.getZ():scale.getY()) && scale.getZ() <= (scale.getX()==0?scale.getZ():scale.getX())){
// scale = new Vect3d(scale.getZ(), scale.getZ(), scale.getZ());
// }
// TreeMap<BoundingBox,Object[]> regionBounds = new TreeMap<>(new Comparator<BoundingBox>() {
// @Override
// public int compare(BoundingBox arg0, BoundingBox arg1) {
// if(arg1 == arg0){
// return 0;
// }
// if(arg0.getLoX() == arg1.getLoX() &&
// arg0.getLoY() == arg1.getLoY() &&
// arg0.getLoZ() == arg1.getLoZ() &&
// arg0.getHiX() == arg1.getHiX() &&
// arg0.getHiY() == arg1.getHiY() &&
// arg0.getHiZ() == arg1.getHiZ()){
// return 0;
// }
// return (arg0.getLoX() >= arg1.getLoX() &&
// arg0.getLoY() >= arg1.getLoY() &&
// arg0.getLoZ() >= arg1.getLoZ() &&
// arg0.getHiX() <= arg1.getHiX() &&
// arg0.getHiY() <= arg1.getHiY() &&
// arg0.getHiZ() <= arg1.getHiZ()?-1:+1);
// }
// });
// for (int j = 0; j < selectedFiles.length; j++) {
// SurfaceCollection surfaceCollection = statsHelper.recalSurfs.get(j);//ClientRequestManager.createSurfaceCollectionFromSurfaceFile(selectedFile);
// for (int i = 0; i < surfaceCollection.getSurfaceCount(); i++) {
// Surface surface = surfaceCollection.getSurfaces(i);
// System.out.println("surface "+i);
// Vect3d xyzLow = new Vect3d(surface.getPolygons(0).getNodes(0).getX(),surface.getPolygons(0).getNodes(1).getX(),surface.getPolygons(0).getNodes(2).getX());
// Vect3d xyzHigh = new Vect3d(xyzLow);
// ComboboxROIName[] existingRoiNames = overlayEditorPanelJAI.getAllCompositeROINamesAndColors();
// byte value = (byte)getUnusedROIColorIndex(existingRoiNames);
// String roiName = FilenameUtils.getBaseName(selectedFiles[j].getName());
// roiName = TokenMangler.fixTokenStrict(roiName, 6);
// roiName+= "_"+i;
// overlayEditorPanelJAI.addROIName(roiName, true, roiName, true, value);
// for (int k = 0; k < surface.getPolygonCount(); k++){
// Polygon polygon = surface.getPolygons(k);
// //							for (Node pnode:polygon.getNodes()) {
// //								xyzLow.set(Math.min(xyzLow.getX(), pnode.getX()),Math.min(xyzLow.getY(), pnode.getY()),Math.min(xyzLow.getZ(), pnode.getZ()));
// //								xyzHigh.set(Math.max(xyzHigh.getX(), pnode.getX()),Math.max(xyzHigh.getY(), pnode.getY()),Math.max(xyzHigh.getZ(), pnode.getZ()));
// //							}
// if(k%10000 == 0){
// System.out.println("progress= file "+(j+1)+" of "+selectedFiles.length+" "+((k*100)/surface.getPolygonCount())+"%");
// }
// //							System.out.println("  polygon "+j+" "+polygon.getNodes(0)+" "+polygon.getNodes(1)+" "+polygon.getNodes(2));
// Vect3d line1 = new Vect3d(polygon.getNodes(0));
// Vect3d end1 = new Vect3d(polygon.getNodes(2));
// Vect3d incr1 = Vect3d.sub(end1,line1);
// incr1.unit();
// incr1.set(incr1.getX()*scale.getX(), incr1.getY()*scale.getY(), incr1.getZ()*scale.getZ());
// Vect3d line2 = new Vect3d(line1);
// Vect3d end2 = new Vect3d(polygon.getNodes(1));
// Vect3d incr2 = Vect3d.sub(end2,line2);
// incr2.unit();
// incr2.set(incr2.getX()*scale.getX(), incr2.getY()*scale.getY(), incr2.getZ()*scale.getZ());
// while(true){
// Vect3d line3 = new Vect3d(line1);
// Vect3d end3 = new Vect3d(line2);
// Vect3d incr3 = Vect3d.sub(end3,line3);
// if(incr3.length() != 0){
// incr3.unit();
// incr3.set(incr3.getX()*scale.getX(), incr3.getY()*scale.getY(), incr3.getZ()*scale.getZ());
// }
// while(true){
// calcXYZ(line3, worldOrigin, worldCollapsedBoundingBox, primarySampleSizes,subSampleOffset,value);
// line3.add(incr3);
// Vect3d check =  Vect3d.sub(end3, line3);
// if((check.length()==0) || Math.signum(check.getX()) != Math.signum(incr3.getX()) || Math.signum(check.getY()) != Math.signum(incr3.getY()) || Math.signum(check.getZ()) != Math.signum(incr3.getZ())){
// calcXYZ(end3, worldOrigin, worldCollapsedBoundingBox, primarySampleSizes,subSampleOffset,value);
// break;
// }
// }
// if(line1.equals(end1) && line2.equals(end2)){
// break;
// }
// 
// line1.add(incr1);
// Vect3d check =  Vect3d.sub(end1, line1);
// if(check.length()==0 || Math.signum(check.getX()) != Math.signum(incr1.getX()) || Math.signum(check.getY()) != Math.signum(incr1.getY()) || Math.signum(check.getZ()) != Math.signum(incr1.getZ())){
// line1 = new Vect3d(end1);
// }
// line2.add(incr2);
// check =  Vect3d.sub(end2, line2);
// if(check.length()==0 || Math.signum(check.getX()) != Math.signum(incr2.getX()) || Math.signum(check.getY()) != Math.signum(incr2.getY()) || Math.signum(check.getZ()) != Math.signum(incr2.getZ())){
// line2 = new Vect3d(end2);
// }
// }
// }
// //						regionBounds.put(new BoundingBox(xyzLow.getX(), xyzHigh.getX(),xyzLow.getY(), xyzHigh.getY(),xyzLow.getZ(), xyzHigh.getZ()),new Object[] {new int[] {j,i},roiName});
// }
// }
// //				for(BoundingBox bb:regionBounds.keySet()){
// //					System.out.println(((int[])regionBounds.get(bb)[0])[0]+","+((int[])regionBounds.get(bb)[0])[1]+" name="+((String)regionBounds.get(bb)[1])+" bound="+bb.getLoX()+","+bb.getHiX()+" "+bb.getLoY()+","+bb.getHiY()+" "+bb.getLoZ()+","+bb.getHiZ());
// //				}
// updateAuxiliaryInfo(originalISize, null);
// getUpdateDisplayAfterCropTask().run(null);
// 
// new Thread(new Runnable() {
// @Override
// public void run() {
// while(ClientTaskDispatcher.isBusy()){
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// TreeMap<RegionInfo, Vect3d[]> regTobb = new TreeMap<>(new Comparator<RegionInfo>() {
// @Override
// public int compare(RegionInfo arg0, RegionInfo arg1) {
// return arg0.getRegionIndex()-arg1.getRegionIndex();
// }
// });
// int allPixCnt = regionImage.getNumX()*regionImage.getNumY()*regionImage.getNumZ();
// for (int z = 0; z < regionImage.getNumZ(); z++) {
// for (int y = 0; y < regionImage.getNumY(); y++) {
// for (int x = 0; x < regionImage.getNumX(); x++) {
// allPixCnt-=1;
// RegionInfo regInfo = regionImage.getRegionInfoFromOffset(allPixCnt);
// Vect3d[] bounds = regTobb.get(regInfo);
// if(bounds == null){
// bounds = new Vect3d[] {new Vect3d(),new Vect3d()};
// regTobb.put(regInfo, bounds);
// }
// bounds[0].set(Math.min(bounds[0].getX(), x),Math.min(bounds[0].getY(), y),Math.min(bounds[0].getZ(), z));
// bounds[1].set(Math.max(bounds[1].getX(), x),Math.max(bounds[1].getY(), y),Math.max(bounds[1].getZ(), z));
// 
// }
// }
// }
// for(RegionInfo regInfo:regTobb.keySet()){
// Vect3d[] varr = regTobb.get(regInfo);
// ComboboxROIName cbxroiName = overlayEditorPanelJAI.getComboboxROIName(regInfo);
// regionBounds.put(new BoundingBox(varr[0].getX(), varr[1].getX(),varr[0].getY(), varr[1].getY(),varr[0].getZ(), varr[1].getZ()),new Object[] {cbxroiName});
// }
// for(BoundingBox bb:regionBounds.keySet()){
// ComboboxROIName cbxroiName = ((ComboboxROIName)regionBounds.get(bb)[0]);
// System.out.println(cbxroiName+" bound="+bb.getLoX()+","+bb.getHiX()+" "+bb.getLoY()+","+bb.getHiY()+" "+bb.getLoZ()+","+bb.getHiZ());
// 
// }
// }
// }).start();
// }
// }catch (Exception e) {
// e.printStackTrace();
// DialogUtils.showErrorDialog(overlayEditorPanelJAI, e.getMessage());
// }
}
Also used : AsynchClientTask(cbit.vcell.client.task.AsynchClientTask) ArrayList(java.util.ArrayList) RegionInfo(cbit.vcell.geometry.RegionImage.RegionInfo) VCImage(cbit.image.VCImage) DataBufferByte(java.awt.image.DataBufferByte) BufferedImage(java.awt.image.BufferedImage) Surface(cbit.vcell.geometry.surface.Surface) OrigSurface(cbit.vcell.geometry.surface.OrigSurface) TreeSet(java.util.TreeSet) BoundingBox(cbit.vcell.geometry.surface.BoundingBox) Polygon(cbit.vcell.geometry.surface.Polygon) SurfaceCollection(cbit.vcell.geometry.surface.SurfaceCollection) Hashtable(java.util.Hashtable) TreeMap(java.util.TreeMap) Point(java.awt.Point) Vect3d(cbit.vcell.render.Vect3d) RegionImage(cbit.vcell.geometry.RegionImage)

Example 8 with Surface

use of cbit.vcell.geometry.surface.Surface in project vcell by virtualcell.

the class ROIMultiPaintManager method calcMinMax.

private static StatsHelper calcMinMax(File[] selectedFiles) throws Exception {
    ArrayList<SurfaceCollection> allSurfCollections = new ArrayList<>();
    TreeMap<String, TreeMap<Integer, ArrayList<TreeMap<Integer, TreeSet<Integer>>>>> fileMapSurfMapSubsurf = new TreeMap<>();
    for (int j = 0; j < selectedFiles.length; j++) {
        File selectedfiFile = selectedFiles[j];
        SurfaceCollection surfaceCollection = ClientRequestManager.createSurfaceCollectionFromSurfaceFile(selectedfiFile);
        if (surfaceCollection == null) {
            throw new Exception("Expecting .stl or .mesh(salk) from file '" + selectedfiFile + "'");
        }
        TreeMap<Integer, ArrayList<TreeMap<Integer, TreeSet<Integer>>>> fileSurf = new TreeMap<>();
        fileMapSurfMapSubsurf.put(selectedfiFile.getAbsolutePath(), fileSurf);
        // nodeMapFace.add(treeMap);
        TreeSet<Integer> allNodes = new TreeSet<>();
        for (int k = 0; k < surfaceCollection.getNodeCount(); k++) {
            allNodes.add(k);
        }
        TreeMap<Integer, ArrayList<TreeSet<Integer>>> allSubSurf = new TreeMap<>();
        int surfOutCount = 0;
        for (int i = 0; i < surfaceCollection.getSurfaceCount(); i++) {
            ArrayList<TreeMap<Integer, TreeSet<Integer>>> surfMap = new ArrayList<>();
            fileSurf.put(i, surfMap);
            TreeMap<Integer, TreeSet<Integer>> treeMap = new TreeMap<>();
            surfMap.add(treeMap);
            Surface surface = surfaceCollection.getSurfaces(i);
            for (int k = 0; k < surface.getPolygonCount(); k++) {
                Polygon polygon = surface.getPolygons(k);
                for (Node node : polygon.getNodes()) {
                    TreeSet<Integer> PolygonIndexes = treeMap.get(node.getGlobalIndex());
                    if (PolygonIndexes == null) {
                        PolygonIndexes = new TreeSet<Integer>();
                        treeMap.put(node.getGlobalIndex(), PolygonIndexes);
                    }
                    PolygonIndexes.add(k);
                }
            }
            allSubSurf.put(i, new ArrayList<>());
            while (allNodes.size() > 0) {
                surfOutCount += 1;
                TreeSet<Integer> searchNodes = new TreeSet<>(Arrays.asList(new Integer[] { allNodes.iterator().next() }));
                TreeSet<Integer> alreadySearched = new TreeSet<>();
                TreeSet<Integer> subSurf = new TreeSet<>();
                allSubSurf.get(i).add(subSurf);
                while (searchNodes.size() > 0) {
                    Integer currentNode = searchNodes.iterator().next();
                    searchNodes.remove(currentNode);
                    alreadySearched.add(currentNode);
                    allNodes.remove(currentNode);
                    TreeSet<Integer> facesForNode = treeMap.get(surfaceCollection.getNodes(currentNode).getGlobalIndex());
                    Iterator<Integer> facesIter = facesForNode.iterator();
                    while (facesIter.hasNext()) {
                        Integer faceIndex = facesIter.next();
                        subSurf.add(faceIndex);
                        Polygon poly = surfaceCollection.getSurfaces(i).getPolygons(faceIndex);
                        for (int k = 0; k < poly.getNodes().length; k++) {
                            if (poly.getNodes()[k].getGlobalIndex() != currentNode && !alreadySearched.contains(poly.getNodes()[k].getGlobalIndex())) {
                                searchNodes.add(poly.getNodes()[k].getGlobalIndex());
                            }
                        }
                    }
                }
            }
        }
        if (surfOutCount > surfaceCollection.getSurfaceCount()) {
            SurfaceCollection newSurfCollection = new SurfaceCollection();
            newSurfCollection.setNodes(surfaceCollection.getNodes());
            for (Integer origSurfIndex : allSubSurf.keySet()) {
                ArrayList<TreeSet<Integer>> newSubSurfaces = allSubSurf.get(origSurfIndex);
                for (TreeSet<Integer> subSurf : newSubSurfaces) {
                    OrigSurface os = new OrigSurface(0, 1);
                    Iterator<Integer> polyIter = subSurf.iterator();
                    while (polyIter.hasNext()) {
                        Polygon poly = surfaceCollection.getSurfaces(origSurfIndex).getPolygons(polyIter.next());
                        os.addPolygon(poly);
                    }
                    newSurfCollection.addSurface(os);
                }
            }
            allSurfCollections.add(newSurfCollection);
        } else {
            allSurfCollections.add(surfaceCollection);
        }
    // fileMapSurfMapSubsurf.get(selectedfiFile.getAbsolutePath()).get(i).add(treeMap);
    }
    StatsHelper statsHelper = new StatsHelper();
    statsHelper.recalSurfs = allSurfCollections;
    for (int j = 0; j < statsHelper.recalSurfs.size(); j++) {
        // File selectedfiFile = selectedFiles[j];
        // SurfaceCollection surfaceCollection = ClientRequestManager.createSurfaceCollectionFromSurfaceFile(selectedfiFile);
        SurfaceCollection surfaceCollection = statsHelper.recalSurfs.get(j);
        for (int i = 0; i < surfaceCollection.getNodes().length; i++) {
            if (j == 0 && i == 0) {
                statsHelper.xmin = surfaceCollection.getNodes()[i].getX();
                statsHelper.xmax = statsHelper.xmin;
                statsHelper.ymin = surfaceCollection.getNodes()[i].getY();
                statsHelper.ymax = statsHelper.ymin;
                statsHelper.zmin = surfaceCollection.getNodes()[i].getZ();
                statsHelper.zmax = statsHelper.zmin;
            }
            statsHelper.xmin = Math.min(statsHelper.xmin, surfaceCollection.getNodes()[i].getX());
            statsHelper.ymin = Math.min(statsHelper.ymin, surfaceCollection.getNodes()[i].getY());
            statsHelper.zmin = Math.min(statsHelper.zmin, surfaceCollection.getNodes()[i].getZ());
            statsHelper.xmax = Math.max(statsHelper.xmax, surfaceCollection.getNodes()[i].getX());
            statsHelper.ymax = Math.max(statsHelper.ymax, surfaceCollection.getNodes()[i].getY());
            statsHelper.zmax = Math.max(statsHelper.zmax, surfaceCollection.getNodes()[i].getZ());
        }
    }
    return statsHelper;
}
Also used : SurfaceCollection(cbit.vcell.geometry.surface.SurfaceCollection) Node(cbit.vcell.geometry.surface.Node) ArrayList(java.util.ArrayList) TreeMap(java.util.TreeMap) Point(java.awt.Point) UtilCancelException(org.vcell.util.UtilCancelException) UserCancelException(org.vcell.util.UserCancelException) Surface(cbit.vcell.geometry.surface.Surface) OrigSurface(cbit.vcell.geometry.surface.OrigSurface) TreeSet(java.util.TreeSet) OrigSurface(cbit.vcell.geometry.surface.OrigSurface) Polygon(cbit.vcell.geometry.surface.Polygon) File(java.io.File)

Example 9 with Surface

use of cbit.vcell.geometry.surface.Surface in project vcell by virtualcell.

the class AVS_UCD_Exporter method writeUCDGeometryOnly.

/**
 * Insert the method's description here.
 * Creation date: (7/19/2004 10:54:30 AM)
 * @param geometrySurfaceDescription cbit.vcell.geometry.surface.GeometrySurfaceDescription
 */
public static void writeUCDGeometryOnly(GeometrySurfaceDescription geometrySurfaceDescription, java.io.Writer writer) throws Exception {
    final String QUAD_TYPE = "quad";
    // GeometricRegion regions[] = geometrySurfaceDescription.getGeometricRegions();
    SurfaceCollection surfaceCollection = geometrySurfaceDescription.getSurfaceCollection();
    if (surfaceCollection == null) {
        geometrySurfaceDescription.updateAll();
        surfaceCollection = geometrySurfaceDescription.getSurfaceCollection();
    }
    Node[] nodes = surfaceCollection.getNodes();
    int numNodes = nodes.length;
    int numCells = 0;
    for (int i = 0; i < surfaceCollection.getSurfaceCount(); i++) {
        numCells += surfaceCollection.getSurfaces(i).getPolygonCount();
    }
    int numNodeData = 0;
    int numCellData = 0;
    int numModelData = 0;
    writer.write(numNodes + " " + numCells + " " + numNodeData + " " + numCellData + " " + numModelData + "\n");
    for (int i = 0; i < nodes.length; i++) {
        writer.write(nodes[i].getGlobalIndex() + " " + nodes[i].getX() + " " + nodes[i].getY() + " " + nodes[i].getZ() + "\n");
    }
    // 
    // print the "Cells" (polygons) for each surface (each surface has it's own material id).
    // 
    int cellID = 0;
    for (int i = 0; i < surfaceCollection.getSurfaceCount(); i++) {
        Surface surface = surfaceCollection.getSurfaces(i);
        // for material now just give it the index (later need to collect these in terms of closed objects).
        String materialType = Integer.toString(i);
        for (int j = 0; j < surface.getPolygonCount(); j++) {
            Polygon polygon = surface.getPolygons(j);
            int node0Index = polygon.getNodes(0).getGlobalIndex();
            int node1Index = polygon.getNodes(1).getGlobalIndex();
            int node2Index = polygon.getNodes(2).getGlobalIndex();
            int node3Index = polygon.getNodes(3).getGlobalIndex();
            writer.write(cellID + " " + materialType + " " + QUAD_TYPE + " " + node0Index + " " + node1Index + " " + node2Index + " " + node3Index + "\n");
            cellID++;
        }
    }
}
Also used : SurfaceCollection(cbit.vcell.geometry.surface.SurfaceCollection) Node(cbit.vcell.geometry.surface.Node) Polygon(cbit.vcell.geometry.surface.Polygon) Surface(cbit.vcell.geometry.surface.Surface)

Example 10 with Surface

use of cbit.vcell.geometry.surface.Surface in project vcell by virtualcell.

the class RegionImage method verifyQuadVertexOrdering.

public void verifyQuadVertexOrdering(double maxAngleDegrees) {
    if (maxAngleDegrees > 180 || maxAngleDegrees < 0) {
        throw new IllegalArgumentException("maxAngleDegrees must be between 0 and 180");
    }
    for (int s = 0; s < surfaceCollection.getSurfaceCount(); s++) {
        Surface surface = surfaceCollection.getSurfaces(s);
        for (int p = 0; p < surface.getPolygonCount(); p++) {
            Quadrilateral quad = (Quadrilateral) surface.getPolygons(p);
            // average the polygon vertices to get the center of the quad
            // this is also halfway between the coordinates of the inside and outside volume elements.
            cbit.vcell.geometry.surface.Node[] nodes = quad.getNodes();
            // have normal go in direction from low region index to high region index
            int lowVolumeIndex = quad.getVolIndexNeighbor1();
            int hiVolumeIndex = quad.getVolIndexNeighbor2();
            int lowRegionIndex = getRegionInfoFromOffset(quad.getVolIndexNeighbor1()).getRegionIndex();
            int hiRegionIndex = getRegionInfoFromOffset(quad.getVolIndexNeighbor2()).getRegionIndex();
            if (lowRegionIndex > hiRegionIndex) {
                int temp = lowVolumeIndex;
                lowVolumeIndex = hiVolumeIndex;
                hiVolumeIndex = temp;
                temp = lowRegionIndex;
                lowRegionIndex = hiRegionIndex;
                hiRegionIndex = temp;
            }
            if (surface.getInteriorRegionIndex() != lowRegionIndex || surface.getExteriorRegionIndex() != hiRegionIndex) {
                StringBuffer buffer = new StringBuffer();
                buffer.append("Surface interiorRegionIndex=" + surface.getInteriorRegionIndex() + " and exteriorRegionIndex=" + surface.getExteriorRegionIndex());
                buffer.append("Polygon lowRegionIndex=" + lowRegionIndex + ", hiRegionIndex=" + hiRegionIndex);
                throw new RuntimeException("surface and polygon indices don't agree\n" + buffer.toString());
            }
            Vect3d v0 = new Vect3d(nodes[0].getX(), nodes[0].getY(), nodes[0].getZ());
            Vect3d v1 = new Vect3d(nodes[1].getX(), nodes[1].getY(), nodes[1].getZ());
            Vect3d v2 = new Vect3d(nodes[2].getX(), nodes[2].getY(), nodes[2].getZ());
            Vect3d v3 = new Vect3d(nodes[3].getX(), nodes[3].getY(), nodes[3].getZ());
            int volumeIndexNormalDiff = hiVolumeIndex - lowVolumeIndex;
            Vect3d v01 = Vect3d.sub(v1, v0);
            Vect3d v02 = Vect3d.sub(v2, v0);
            Vect3d unit012 = v01.cross(v02);
            unit012.unit();
            Vect3d v03 = Vect3d.sub(v3, v0);
            Vect3d unit023 = v02.cross(v03);
            unit023.unit();
            Vect3d gridNormal = null;
            if (volumeIndexNormalDiff == 1) {
                // y-z plane, normal is [1 0 0]
                gridNormal = new Vect3d(1, 0, 0);
            } else if (volumeIndexNormalDiff == -1) {
                // y-z plane, normal is [-1 0 0]
                gridNormal = new Vect3d(-1, 0, 0);
            } else if (volumeIndexNormalDiff == getNumX()) {
                // y-z plane, normal is [0 1 0]
                gridNormal = new Vect3d(0, 1, 0);
            } else if (volumeIndexNormalDiff == -getNumX()) {
                // y-z plane, normal is [0 -1 0]
                gridNormal = new Vect3d(0, -1, 0);
            } else if (volumeIndexNormalDiff == getNumX() * getNumY()) {
                // y-z plane, normal is [0 0 1]
                gridNormal = new Vect3d(0, 0, 1);
            } else if (volumeIndexNormalDiff == -getNumX() * getNumY()) {
                // y-z plane, normal is [0 0 -1]
                gridNormal = new Vect3d(0, 0, -1);
            }
            if (this.filterCutoffFrequency < NO_SMOOTHING) {
                // after smoothing ... should point in general direction (<90 degrees).
                if (unit012.dot(unit023) < Math.cos(maxAngleDegrees / 180.0 * Math.PI)) {
                    StringBuffer buffer = new StringBuffer();
                    buffer.append("normal_012 = [" + unit012.getX() + " " + unit012.getY() + " " + unit012.getZ() + "]\n");
                    buffer.append("normal_023 = [" + unit023.getX() + " " + unit023.getY() + " " + unit023.getZ() + "]\n");
                    buffer.append("gridNormal = [" + gridNormal.getX() + " " + gridNormal.getY() + " " + gridNormal.getZ() + "]\n");
                    throw new RuntimeException("quad(" + p + ") on surface(" + s + "): two triangles from same quad (norm1.dot(norm2)=" + unit012.dot(unit023) + ") are > " + maxAngleDegrees + " degrees or inner product < " + Math.cos(maxAngleDegrees / 180.0 * Math.PI) + ":\n" + buffer.toString());
                } else if (unit012.dot(gridNormal) < Math.cos(maxAngleDegrees / 180.0 * Math.PI)) {
                    StringBuffer buffer = new StringBuffer();
                    buffer.append("normal_012 = [" + unit012.getX() + " " + unit012.getY() + " " + unit012.getZ() + "]\n");
                    buffer.append("normal_023 = [" + unit023.getX() + " " + unit023.getY() + " " + unit023.getZ() + "]\n");
                    buffer.append("gridNormal = [" + gridNormal.getX() + " " + gridNormal.getY() + " " + gridNormal.getZ() + "]\n");
                    throw new RuntimeException("quad(" + p + ") on surface(" + s + "): quad normal compared with grid normal (norm.dot(gridNormal)=" + unit012.dot(unit023) + ") is > " + maxAngleDegrees + " degrees or inner product < " + Math.cos(maxAngleDegrees / 180.0 * Math.PI) + " from orginal staircase:\n" + buffer.toString());
                } else {
                // System.out.println("normals ok");
                }
            } else {
                // no smoothing ... both triangle normals must light up exactly
                if (Math.abs(unit012.dot(unit023) - 1.0) > 1e-8) {
                    StringBuffer buffer = new StringBuffer();
                    buffer.append("two triangles contradicted themselves\n");
                    buffer.append("normal_012 = [" + unit012.getX() + " " + unit012.getY() + " " + unit012.getZ() + "]\n");
                    buffer.append("normal_023 = [" + unit023.getX() + " " + unit023.getY() + " " + unit023.getZ() + "]\n");
                    buffer.append("gridNormal = [" + gridNormal.getX() + " " + gridNormal.getY() + " " + gridNormal.getZ() + "]\n");
                    throw new RuntimeException("two triangles from same quad have normals that are in opposite directions:\n" + buffer.toString());
                } else if (Math.abs(unit012.dot(gridNormal) - 1.0) > 1e-8) {
                    StringBuffer buffer = new StringBuffer();
                    buffer.append("normal_012 = [" + unit012.getX() + " " + unit012.getY() + " " + unit012.getZ() + "]\n");
                    buffer.append("normal_023 = [" + unit023.getX() + " " + unit023.getY() + " " + unit023.getZ() + "]\n");
                    buffer.append("gridNormal = [" + gridNormal.getX() + " " + gridNormal.getY() + " " + gridNormal.getZ() + "]\n");
                    throw new RuntimeException("triangles contradict grid normal:\n" + buffer.toString());
                } else {
                // System.out.println("normals ok");
                }
            }
        }
    }
}
Also used : Quadrilateral(cbit.vcell.geometry.surface.Quadrilateral) Node(cbit.util.graph.Node) OrigSurface(cbit.vcell.geometry.surface.OrigSurface) Surface(cbit.vcell.geometry.surface.Surface) Vect3d(cbit.vcell.render.Vect3d)

Aggregations

Surface (cbit.vcell.geometry.surface.Surface)11 SurfaceCollection (cbit.vcell.geometry.surface.SurfaceCollection)8 Polygon (cbit.vcell.geometry.surface.Polygon)6 Node (cbit.vcell.geometry.surface.Node)5 GeometricRegion (cbit.vcell.geometry.surface.GeometricRegion)4 GeometrySurfaceDescription (cbit.vcell.geometry.surface.GeometrySurfaceDescription)4 OrigSurface (cbit.vcell.geometry.surface.OrigSurface)4 SurfaceGeometricRegion (cbit.vcell.geometry.surface.SurfaceGeometricRegion)4 VolumeGeometricRegion (cbit.vcell.geometry.surface.VolumeGeometricRegion)4 Vect3d (cbit.vcell.render.Vect3d)4 Point (java.awt.Point)4 ArrayList (java.util.ArrayList)4 TreeSet (java.util.TreeSet)4 AsynchClientTask (cbit.vcell.client.task.AsynchClientTask)3 RegionImage (cbit.vcell.geometry.RegionImage)3 Color (java.awt.Color)3 HashSet (java.util.HashSet)3 Hashtable (java.util.Hashtable)3 DisplayAdapterService (cbit.image.DisplayAdapterService)2 Node (cbit.util.graph.Node)2