2015-07-09 14 views
0

Я создаю срезы SVG из файлов STL. Файлы SVG состоят из множества строк. Короче говоря, я не могу использовать встроенные функции JavaFX для создания шаблона заполнения SVG. Причина была связана с тем, что SVG не создается правильно, потому что код выполняет перемещение, а затем линию, а затем перемещается, а затем линия. Чтобы использовать функцию заполнения, я думаю, вам нужно иметь один ход, а затем много строк. Слишком давно, чтобы вспомнить точный вопрос.Я хочу создать шаблон заливки для 3D-печати в JavaFX/Java

Так вот что я делаю сейчас, чтобы решить проблему. Я сохраняю шаблон заполнения, сотовый шаблон заполнения, в файле. Это может быть, конечно, храниться в памяти, но оно предназначено для тестирования. Затем я сохраняю полый срез во втором файле. Мне нужно совместить эти два так, чтобы удалялись только части сот, которые находятся внутри дисплея слоя/среза, а остальные. Соты должны быть белыми, а срез должен быть белым. План состоял в том, чтобы сделать сотовый белый, когда я скопирую его на кусочек.

Я пробовал два метода.

Первый метод, который я пытался, заключался в том, чтобы скопировать пиксели из шаблона заполнения в слой/срез. Я попытался найти, где линии слоя, а затем попытаться выяснить, где внутри и снаружи. Я провалил. Код будет прикреплен к нижней части этого вопроса.

Второй способ, который я пытался использовать, - использовать blendMode, но ни один из режимов, похоже, не выполняет то, что мне нужно.

Первый метод Код Я попытался сохранения сотов и слой в различных цветах, я пытался спасти их друг на друга, а затем удалить соты. Здесь вы можете увидеть, что я пытаюсь выяснить, что находится внутри и что снаружи, но я не мог заставить его работать

package javaapplication3; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.scene.image.PixelReader; 
import javafx.scene.image.PixelWriter; 
import javafx.scene.image.WritableImage; 
import javafx.scene.paint.Color; 
import javax.imageio.ImageIO; 

public class JavaApplication3 { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     try { 
      File file = new File("C:\\Temp\\Mandibular\\MandibularsolidNOreferencepoints.gizmofill0.gizmoslice.png"); 
      BufferedImage bufImage = ImageIO.read(file); 

      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null); 

      PixelReader pixelReader = writableImage.getPixelReader(); 
      int width = (int) writableImage.getWidth(); 
      int height = (int) writableImage.getHeight(); 

      WritableImage dest = new WritableImage(width, height); 
      PixelWriter writer = dest.getPixelWriter(); 
      boolean isOnLine = false; 
      boolean previousIsOnLine = false; 
      boolean isInside = false; 
      for (int x = 0; x < width; x++) { 
       for (int y = 00; y < height; y++) { 
        // reading a pixel from src image, 
        // then writing a pixel to dest image 
        Color color = pixelReader.getColor(x, y); 
        double red = color.getRed(); 
        double green = color.getGreen(); 
        double blue = color.getBlue(); 

        if (red == 0 && green == 1 && blue == 0) { 
         //isInside = !isInside; 
         isOnLine = true; 
        } else { 
         previousIsOnLine = isOnLine; 
         isOnLine = false; 
        } 

        if (previousIsOnLine) { 
         isInside = !isInside; 
        } 

        /*if (isOnLine && red == 1 && green == 0 && blue == 0) { 
         isInside = true; 
         isOnLine = false; 
        }*/ 

        if (isOnLine || isInside) { 
         writer.setColor(x, y, color); 
        } 
        /*if (isOnLine || isInside && (red > 0 && green == 0 && blue == 0)) { 
         writer.setColor(x, y, Color.WHITE); 
        }*/ 

       } 
      } 


      File outputFile = new File("C:\\Temp\\Mandibular\\test.png"); 
      ImageIO.write(SwingFXUtils.fromFXImage(dest, null), "png", outputFile); 

     } catch (IOException ex) { 
      Logger.getLogger(JavaApplication3.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 

Второй метод с использованием смеси Я попробовал различные blendModes и закончился последний один layerView.setBlendMode (BlendMode.SRC_ATOP); что явно не делает то, что мне нужно. Я просто проверял каждый из них, чтобы увидеть, что может работать

package javafxapplication15; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.application.Application; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.SnapshotParameters; 
import javafx.scene.control.Button; 
import javafx.scene.effect.BlendMode; 
import javafx.scene.image.ImageView; 
import javafx.scene.image.WritableImage; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javax.imageio.ImageIO; 

public class JavaFXApplication15 extends Application { 
    private void doWork() { 
     try { 
      // TODO code application logic here 
      File file = new File("C:\\Temp\\Mandibular\\MandibularsolidNOreferencepoints.gizmofill0.gizmoslice.png"); 
      BufferedImage layerImage = ImageIO.read(file); 

      file = new File("C:\\Temp\\Mandibular\\MandibularsolidNOreferencepoints.gizmofill-1.gizmoslice.png"); 
      BufferedImage fillImage = ImageIO.read(file); 

      WritableImage layerWritableImage = SwingFXUtils.toFXImage(layerImage, null); 
      WritableImage fillWritableImage = SwingFXUtils.toFXImage(fillImage, null); 

      WritableImage temp = copyImageOntoFillPattern(fillWritableImage, layerWritableImage); 


      File outputFile = new File("C:\\Temp\\Mandibular\\test.png"); 
      ImageIO.write(SwingFXUtils.fromFXImage(temp, null), "png", outputFile); 
     } catch (IOException ex) { 
      Logger.getLogger(JavaFXApplication15.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
    private WritableImage copyImageOntoFillPattern(final WritableImage fillPatternImage, final WritableImage sourceImage) { 

     ImageView fillPatternView = new ImageView(fillPatternImage); 
     ImageView layerView = new ImageView(sourceImage); 
     layerView.setBlendMode(BlendMode.SRC_ATOP); 

     Group blend = new Group(fillPatternView, layerView); 

     blend.snapshot(null, sourceImage); 
     SnapshotParameters param = new SnapshotParameters(); 
     final WritableImage snapshotCombined = blend.snapshot(param, null); 
     return snapshotCombined; 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 
       doWork(); 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

} 

Layer

Honeycomb fill pattern and layer

ответ

0

Я щелкнул вокруг, может быть, час изменения .fxml файла

Вот содержимое файла , Мне нужно преобразовать его в код, который я могу запустить, но теперь не должен быть слишком тяжелым.

Слой, который необходимо заполнить, цвет заливки не имеет значения. Я сделал его зеленым, чтобы его можно было увидеть на веб-сайте здесь, но я, вероятно, создам его как белый, когда создам его в своем слайсер. Я также сделал сотовый красный цвет, чтобы его было легче видеть.Я показываю изображение SceneBuilder, где он работал

Я теперь просто создать соты в виде белого, а слой в виде твердого вещества белого и все будет замечательно

Slice or Layer

Honeycomb

Combination in Scene Builder

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.effect.*?> 
<?import javafx.scene.image.*?> 
<?import javafx.scene.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
     <Group blendMode="HARD_LIGHT"> 
     <children> 
      <ImageView blendMode="DIFFERENCE" cache="true" fitHeight="418.0" fitWidth="591.0" pickOnBounds="true" preserveRatio="true"> 
       <image> 
        <Image url="@outline.png" /> 
       </image> 
      </ImageView> 
      <ImageView blendMode="SRC_ATOP" fitHeight="451.0" fitWidth="688.0" pickOnBounds="true" preserveRatio="true"> 
       <image> 
        <Image url="@honeycomb.png" /> 
       </image> 
       <effect> 
        <Blend mode="ADD" /> 
       </effect> 
      </ImageView> 
     </children> 
     </Group> 
    </children> 
</AnchorPane>