Search in sources :

Example 1 with Vect3d

use of cbit.vcell.render.Vect3d 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 2 with Vect3d

use of cbit.vcell.render.Vect3d in project vcell by virtualcell.

the class SurfaceRenderer method createScreenPolygon.

/**
 * Insert the method's description here.
 * Creation date: (10/11/2005 8:12:13 AM)
 * @return cbit.vcell.geometry.surface.Polygon
 */
private java.awt.Polygon createScreenPolygon(cbit.vcell.geometry.surface.Polygon polygon, int[] xPoints, int[] yPoints, double xOffset, double xScale, double yOffset, double yScale) {
    Vect3d point = new Vect3d();
    Vect3d proj = new Vect3d();
    int polygonDim = polygon.getNodeCount();
    for (int k = 0; k < polygonDim; k++) {
        cbit.vcell.geometry.surface.Node node = polygon.getNodes(k);
        point.set(node.getX(), node.getY(), node.getZ());
        getTrackball().getCamera().projectPoint(point, proj);
        xPoints[k] = (int) (xOffset + xScale * proj.getX());
        yPoints[k] = (int) (yOffset + yScale * proj.getY());
    }
    return new java.awt.Polygon(xPoints, yPoints, 4);
}
Also used : Polygon(cbit.vcell.geometry.surface.Polygon) Vect3d(cbit.vcell.render.Vect3d)

Example 3 with Vect3d

use of cbit.vcell.render.Vect3d in project vcell by virtualcell.

the class SurfaceRenderer method createBoundingBoxInfo.

/**
 * Insert the method's description here.
 * Creation date: (10/12/2005 7:27:33 AM)
 */
public BoundingBoxInfo createBoundingBoxInfo(int width, int height, boolean bEnableDepthCueing) {
    Vect3d[] boundingBoxCorners = { new Vect3d(fieldOrigin.getX() + 0 * fieldExtent.getX(), fieldOrigin.getY() + 0 * fieldExtent.getY(), fieldOrigin.getZ() + 0 * fieldExtent.getZ()), new Vect3d(fieldOrigin.getX() + 0 * fieldExtent.getX(), fieldOrigin.getY() + 0 * fieldExtent.getY(), fieldOrigin.getZ() + 1 * fieldExtent.getZ()), new Vect3d(fieldOrigin.getX() + 0 * fieldExtent.getX(), fieldOrigin.getY() + 1 * fieldExtent.getY(), fieldOrigin.getZ() + 0 * fieldExtent.getZ()), new Vect3d(fieldOrigin.getX() + 0 * fieldExtent.getX(), fieldOrigin.getY() + 1 * fieldExtent.getY(), fieldOrigin.getZ() + 1 * fieldExtent.getZ()), new Vect3d(fieldOrigin.getX() + 1 * fieldExtent.getX(), fieldOrigin.getY() + 0 * fieldExtent.getY(), fieldOrigin.getZ() + 0 * fieldExtent.getZ()), new Vect3d(fieldOrigin.getX() + 1 * fieldExtent.getX(), fieldOrigin.getY() + 0 * fieldExtent.getY(), fieldOrigin.getZ() + 1 * fieldExtent.getZ()), new Vect3d(fieldOrigin.getX() + 1 * fieldExtent.getX(), fieldOrigin.getY() + 1 * fieldExtent.getY(), fieldOrigin.getZ() + 0 * fieldExtent.getZ()), new Vect3d(fieldOrigin.getX() + 1 * fieldExtent.getX(), fieldOrigin.getY() + 1 * fieldExtent.getY(), fieldOrigin.getZ() + 1 * fieldExtent.getZ()) };
    double minZ = Double.MAX_VALUE;
    double maxZ = -Double.MAX_VALUE;
    Vect3d proj = new Vect3d();
    for (int i = 0; i < boundingBoxCorners.length; i++) {
        getTrackball().getCamera().projectPoint(boundingBoxCorners[i], proj);
        minZ = Math.min(minZ, proj.getZ());
        maxZ = Math.max(maxZ, proj.getZ());
    }
    double depthCue = (bEnableDepthCueing) ? (0.6 / (maxZ - minZ)) : (0.0);
    double tempXScale = 0.9 * width / 1;
    double tempYScale = 0.9 * height / 1;
    double xScale = Math.min(tempXScale, tempYScale);
    double yScale = Math.min(tempXScale, tempYScale);
    double xOffset = width / 2;
    double yOffset = height / 2;
    BoundingBoxInfo bbi = new BoundingBoxInfo();
    bbi.boundingBoxCorners = boundingBoxCorners;
    bbi.minZ = minZ;
    bbi.maxZ = maxZ;
    bbi.depthCue = depthCue;
    bbi.xScale = xScale;
    bbi.xOffset = xOffset;
    bbi.yScale = yScale;
    bbi.yOffset = yOffset;
    return bbi;
}
Also used : Vect3d(cbit.vcell.render.Vect3d)

Example 4 with Vect3d

use of cbit.vcell.render.Vect3d in project vcell by virtualcell.

the class SurfaceRenderer method createProjectedScreenPolygons.

/**
 * Insert the method's description here.
 * Creation date: (7/7/2004 11:25:42 AM)
 * @param g java.awt.Graphics
 */
public PolygonInfo[] createProjectedScreenPolygons(SurfaceCollection surfaceCollection, int[] quickRenderSkip, BoundingBoxInfo bbi) {
    int[] xPoints = new int[4];
    int[] yPoints = new int[4];
    ArrayList<PolygonInfo> polygonInfoList = new ArrayList<PolygonInfo>(1000);
    Vect3d centroid = new Vect3d();
    Vect3d centroidProj = new Vect3d();
    Vect3d unitNormal = new Vect3d();
    Vect3d cameraVector = new Vect3d(0, 0, 1);
    Vect3d cameraVectorScene = new Vect3d();
    getTrackball().getCamera().unProjectPoint(cameraVector, cameraVectorScene);
    cameraVectorScene.unit();
    for (int i = 0; i < surfaceCollection.getSurfaceCount(); i++) {
        cbit.vcell.geometry.surface.Surface surface = surfaceCollection.getSurfaces(i);
        for (int j = 0; j < surface.getPolygonCount(); j++) {
            if (quickRenderSkip != null && (quickRenderSkip[i] == 0 || j % quickRenderSkip[i] != 0)) {
                continue;
            }
            cbit.vcell.geometry.surface.Polygon polygon = surface.getPolygons(j);
            // find centroid depth along user line of sight
            calculateProjectedCentroid(polygon, centroid, centroidProj);
            double depth = centroidProj.getZ();
            // depthCue color scale
            float notFlatShadeColorScale = (float) (1.0 - bbi.depthCue * (depth - bbi.minZ));
            // calculate flat shading scale, adjust due to normal
            polygon.getUnitNormal(unitNormal);
            double dot = unitNormal.dot(cameraVectorScene);
            float flatShadeColorScale = (float) (0.5 * notFlatShadeColorScale + 0.5 * Math.pow(Math.abs(dot), 2));
            // make sure color scale between 0 and 1
            notFlatShadeColorScale = (float) Math.min(1.0, Math.max(0.0, notFlatShadeColorScale));
            flatShadeColorScale = (float) Math.min(1.0, Math.max(0.0, flatShadeColorScale));
            polygonInfoList.add(new PolygonInfo(createScreenPolygon(polygon, xPoints, yPoints, bbi.xOffset, bbi.xScale, bbi.yOffset, bbi.yScale), depth, flatShadeColorScale, notFlatShadeColorScale, i, j));
        }
    }
    Collections.sort(polygonInfoList);
    PolygonInfo[] polygonInfoArr = new PolygonInfo[polygonInfoList.size()];
    polygonInfoList.toArray(polygonInfoArr);
    return polygonInfoArr;
}
Also used : ArrayList(java.util.ArrayList) Polygon(cbit.vcell.geometry.surface.Polygon) Vect3d(cbit.vcell.render.Vect3d)

Example 5 with Vect3d

use of cbit.vcell.render.Vect3d in project vcell by virtualcell.

the class GeometryGuiTest method getExampleGeometryCSG.

public static Geometry getExampleGeometryCSG() throws PropertyVetoException, ExpressionException, GeometryException, ImageException {
    // translated rotated cube
    CSGPrimitive cube = new CSGPrimitive("cube", CSGPrimitive.PrimitiveType.CUBE);
    CSGRotation rotatedCube = new CSGRotation("Rotation", new Vect3d(1, 2, 3), Math.PI / 4.0);
    rotatedCube.setChild(cube);
    // translated sphere
    CSGTranslation translatedSphere = new CSGTranslation("translation", new Vect3d(0.5, 0.5, 0.5));
    CSGPrimitive sphere = new CSGPrimitive("sphere", CSGPrimitive.PrimitiveType.SPHERE);
    translatedSphere.setChild(sphere);
    // union
    CSGSetOperator csgSetOperator = new CSGSetOperator("difference", OperatorType.DIFFERENCE);
    csgSetOperator.addChild(rotatedCube);
    csgSetOperator.addChild(translatedSphere);
    // scaled union
    CSGScale csgScale = new CSGScale("scale", new Vect3d(3, 3, 3));
    csgScale.setChild(csgSetOperator);
    CSGTranslation csgTranslatedUnion = new CSGTranslation("translationUnion", new Vect3d(5, 5, 5));
    csgTranslatedUnion.setChild(csgScale);
    Geometry geometry = new Geometry("csg", 3);
    CSGObject csgObject = new CSGObject(null, "obj1", 1);
    csgObject.setRoot(csgTranslatedUnion);
    geometry.getGeometrySpec().addSubVolume(new AnalyticSubVolume("background", new Expression(1.0)));
    geometry.getGeometrySpec().addSubVolume(csgObject, true);
    geometry.refreshDependencies();
    geometry.precomputeAll(new GeometryThumbnailImageFactoryAWT());
    return geometry;
}
Also used : Geometry(cbit.vcell.geometry.Geometry) GeometryThumbnailImageFactoryAWT(cbit.vcell.geometry.GeometryThumbnailImageFactoryAWT) CSGTranslation(cbit.vcell.geometry.CSGTranslation) Expression(cbit.vcell.parser.Expression) CSGPrimitive(cbit.vcell.geometry.CSGPrimitive) CSGObject(cbit.vcell.geometry.CSGObject) CSGRotation(cbit.vcell.geometry.CSGRotation) CSGSetOperator(cbit.vcell.geometry.CSGSetOperator) AnalyticSubVolume(cbit.vcell.geometry.AnalyticSubVolume) Vect3d(cbit.vcell.render.Vect3d) CSGScale(cbit.vcell.geometry.CSGScale)

Aggregations

Vect3d (cbit.vcell.render.Vect3d)31 CSGObject (cbit.vcell.geometry.CSGObject)7 ArrayList (java.util.ArrayList)7 CSGNode (cbit.vcell.geometry.CSGNode)5 CSGScale (cbit.vcell.geometry.CSGScale)5 CSGTranslation (cbit.vcell.geometry.CSGTranslation)5 Geometry (cbit.vcell.geometry.Geometry)5 Polygon (cbit.vcell.geometry.surface.Polygon)5 VCImage (cbit.image.VCImage)4 CSGRotation (cbit.vcell.geometry.CSGRotation)4 ImageException (cbit.image.ImageException)3 AnalyticSubVolume (cbit.vcell.geometry.AnalyticSubVolume)3 CSGPrimitive (cbit.vcell.geometry.CSGPrimitive)3 GeometrySpec (cbit.vcell.geometry.GeometrySpec)3 SubVolume (cbit.vcell.geometry.SubVolume)3 GeometrySurfaceDescription (cbit.vcell.geometry.surface.GeometrySurfaceDescription)3 Surface (cbit.vcell.geometry.surface.Surface)3 SurfaceCollection (cbit.vcell.geometry.surface.SurfaceCollection)3 CompartmentSubDomain (cbit.vcell.math.CompartmentSubDomain)3 MembraneSubDomain (cbit.vcell.math.MembraneSubDomain)3