3

了解しました。これを開始するにはどうすればよいですか。

画面にいくつかの形(実際には数千)を描くことができるアプリケーションがあります。それらには、長方形と線の2つのタイプがあります。長方形には塗りつぶしがあり、線にはストローク+ストロークの太さがあります。

2つのファイルからデータを読み取ります。1つは上面のデータ、もう1つは下面のデータです。データを表示するには、キャンバスを内部に持つビューボックスを使用します(コンテンツが適切に引き伸ばされます)。ディスプレイ上の全体は次のようになります(これは正しいです):

画面のトップ 画面下部

これで、まったく同じアプリケーションがこのイメージをプリンターに印刷することになっています(テストには、Windowsに付属のXPSプリンターを使用します)。

私がそれを印刷すると(コードが続きます)、それは上にまったく同じ図面を与えますが、下に次のようになります:

プリントアウトの下部

すべての「線」が欠落しているように見えます(長方形が存在します)。下部を表示するには、-1 / -1のスケール変換を使用します(水平方向と垂直方向にミラーリングします)。スケール変換を1/1に設定すると、次のようになります。

下-ミラーリングされていません

今、私は立ち往生しています。なぜすべての線が消えるのですか、ミラーリングされていない場合はそこにあります。また、最も外側の長方形が少しずれています(これはデータが原因である可能性があるため、それに焦点を当てないでください)。

画面に描画するために使用するコードは次のとおりです。

                <Viewbox Grid.Row="0" RenderTransform="{Binding RenderTransform}" Margin="20" Name="VwBox">
                <Viewbox.RenderTransformOrigin>
                    <Point X="0.5" Y="0.5"></Point>
                </Viewbox.RenderTransformOrigin>
                <ItemsControl ItemsSource="{Binding Drawing}" ItemTemplateSelector="{StaticResource DataTypeTemplateSelector}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas Width="{Binding DrawingWidth}" Height="{Binding DrawingHeight}">
                            </Canvas>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>

                    <ItemsControl.ItemContainerStyle>
                        <Style TargetType="ContentPresenter">
                            <Setter Property="Canvas.Left" Value="{Binding Left}"/>
                            <Setter Property="Canvas.Top" Value="{Binding Top}"/>
                        </Style>
                    </ItemsControl.ItemContainerStyle>
                </ItemsControl>
            </Viewbox>

印刷については、XAMlに依存していませんが、手動で実行します(ContentPresenterを使用するかどうかに関係なく、変更はありません)。

                if (gs is GerberLine)
            {                   
                ContentPresenter cp = new ContentPresenter();
                var line = new Line();
                Canvas.SetLeft(cp, gs.Left);
                Canvas.SetTop(cp, gs.Top);
                line.X1 = 0.0;
                line.Y1 = 0.0;
                line.X2 = gs.Width;
                line.Y2 = gs.Height;
                line.Stroke = gs.Brush;
                line.StrokeThickness = ((GerberLine)gs).StrokeThickness;
                cp.Content = line;
                c.Children.Add(cp);
            }
            if (gs is GerberRect)
            {
                var r = new Rectangle();
                Canvas.SetLeft(r, gs.Left);
                Canvas.SetTop(r, gs.Top);
                r.Width = gs.Width;
                r.Height = gs.Height;
                r.Fill = gs.Brush;
                c.Children.Add(r);
            }

上面図は常に正しいので(垂直方向にもミラーリングされているため)、水平方向にミラーリングするとすぐに線が消えるように見えます。

何か案は?不明な点がございましたら、お気軽にお問い合わせください。スケール変換と関係があると思いますが、どうしてかわかりません(なぜ画面上で動作するのですか?)。

4

1 に答える 1

5

これが私が試みることです:

  1. たぶん、特にXPSドライバーは負のスケーリングを好まないでしょう。別のプリンター(PDF出力または実際のプリンター)でテストします。

  2. Scale(-1、-1)の代わりにRotate(180)を使用します。

  3. 印刷用のターゲットドキュメントを作成したら、 RenderTargetBitmapを使用してラスタライズし、結果のビットマップを保存して、期待どおりに表示されるかどうかを確認します。

  4. 最小限のGerberモデルを作成し、それをXPSコードパスを介して送信します。.xpsの名前を.zipに変更し、XMLを直接検査します(Documents\1\Pages\1.fpageまたは類似のものになります)。

于 2013-03-05T21:21:29.507 に答える