【Aspose.Cad】 DWGファイルからPDF/TIFに変換した結果がAutoCADの出力と違う

添付しているDWGファイルにはModelとLayout1という2つのレイアウトがあります。
これらを次のコードで出力したとき(PDF/TIF)の結果と、
AutoCADで見たときの表示が異なります。
PDFもTIFもどちらも1枚目(Model)と同じ内容が出力されてしまいます。
919.zip (1.2 MB)

        string dwgFilePath2 = @"E:\919.dwg";
        using (CadImage cadImage = (CadImage)CadImage.Load(dwgFilePath2))
        {
            cadImage.UpdateSize();
            List<string> layoutNameList = new List<string>();
            foreach (Aspose.CAD.FileFormats.Cad.CadObjects.CadLayout layout in cadImage.Layouts.Values)
            {
                layoutNameList.Add(layout.LayoutName);
            }


            {
                PdfOptions pdfOptions = new Aspose.CAD.ImageOptions.PdfOptions();
                CadRasterizationOptions rasterizationOptions = new CadRasterizationOptions();
                Aspose.CAD.FileFormats.Cad.CadLayoutDictionary layouts = cadImage.Layouts;
                rasterizationOptions.PageWidth = cadImage.Width;
                rasterizationOptions.PageHeight = cadImage.Height;
                rasterizationOptions.DrawType = Aspose.CAD.FileFormats.Cad.CadDrawTypeMode.UseDrawColor;
                rasterizationOptions.Layouts = layoutNameList.ToArray();
                pdfOptions.VectorRasterizationOptions = rasterizationOptions;
                cadImage.Save("test20230420.pdf", pdfOptions);
            }

            {
                TiffOptions tifOptions = new Aspose.CAD.ImageOptions.TiffOptions(Aspose.CAD.FileFormats.Tiff.Enums.TiffExpectedFormat.TiffCcittFax4);
                CadRasterizationOptions rasterizationOptions = new CadRasterizationOptions();
                Aspose.CAD.FileFormats.Cad.CadLayoutDictionary layouts = cadImage.Layouts;
                rasterizationOptions.PageWidth = cadImage.Width;
                rasterizationOptions.PageHeight = cadImage.Height;
                rasterizationOptions.DrawType = Aspose.CAD.FileFormats.Cad.CadDrawTypeMode.UseDrawColor;
                rasterizationOptions.Layouts = layoutNameList.ToArray();

                tifOptions = new Aspose.CAD.ImageOptions.TiffOptions(Aspose.CAD.FileFormats.Tiff.Enums.TiffExpectedFormat.TiffCcittFax4);
                tifOptions.Compression = Aspose.CAD.FileFormats.Tiff.Enums.TiffCompressions.CcittFax4;
                tifOptions.VectorRasterizationOptions = rasterizationOptions;
                cadImage.Save("test20230420.tif", tifOptions);
            }
        }

@yokomichi,
こんにちは。
予想される違いを強調していただけますか?

下記の画像のように表示内容が異なってしまいます。
comment.png (535.1 KB)

1 Like

@yokomichi,
これはPCで見れます TrueView.png (75.3 KB) 。 Autocad はレイアウト 1 の繰り返しモデル コンテンツも表示しますが、「Autodesk DWG ではありません。この DWG ファイルは、Autodesk によって開発またはライセンス供与されていないソフトウェア アプリケーションによって保存されました。Autodesk は、このファイルのアプリケーションの互換性または完全性を保証できません。」というメッセージが表示されます。

しかし、空のレイアウト 1 が ODA ビューアに表示されていることも確認できます。

このファイルの作成に使用されたソフトウェアを教えてください。?

はい。Autocadの互換ソフトウェアで作られたDWGファイルになります。
IRONCADというCADソフトで作られたDWGファイルになります。

@yokomichi,
ありがとうございます。調査のため、少々お時間をください。

いくつかデータを作成しました。
何かヒントになれば幸いです。
Draft Document1とDraft Document4が異常となるデータです。
https://ironcad.fun/downloads/to_aspose/AsposeTest.zip

IRONCADのトライアル版はこちらから入手できます。
https://download.ironcad.com/download/Install/2023/SP1/Full/IRONCAD2023SP1_x64_18517.exe

@yokomichi
We have opened the following new ticket(s) in our internal issue tracking system and will deliver their fixes according to the terms mentioned in Free Support Policies.

Issue ID(s): CADNET-9089

You can obtain Paid Support Services if you need support on a priority basis, along with the direct access to our Paid Support management team.

@yokomichi,
オプション rasterizationOptions.Layouts を削除してみてください。 設定されていない場合、エンジンは空のレイアウトとデフォルトで生成されたレイアウトを除くすべてのレイアウトをエクスポートします。 このオプションを設定すると、指定されたすべてのレイアウトがその内容に関係なくエクスポートされます。

ご返信ありがとうございます。
Layoutsを削除すると空のレイアウトとデフォルトで作成されたレイアウトがエクスポートされないことを確認できました。

追加で質問させてください。
DWGファイルの空のレイアウトとデフォルトで作成されたレイアウトをエクスポートしない、かつすべての空でない有効なレイアウトをJPEGでエクスポートしたいです。
その場合どのようにすればよいでしょうか?
Layoutを指定しない場合Modelのみが出力されます。他のレイアウトの出力は無視されてしまいます。

        string dwgFilePath2 = @"E:\919.dwg";
        using (CadImage cadImage = (CadImage)CadImage.Load(dwgFilePath2))
        {
            cadImage.UpdateSize();
            List<string> layoutNameList = new List<string>();
            foreach (Aspose.CAD.FileFormats.Cad.CadObjects.CadLayout layout in cadImage.Layouts.Values)
            {
                layoutNameList.Add(layout.LayoutName);
            }
            {
                JpegOptions jpgOptions = new Aspose.CAD.ImageOptions.JpegOptions();
                CadRasterizationOptions rasterizationOptions = new CadRasterizationOptions();
                rasterizationOptions.PageWidth = cadImage.Width;
                rasterizationOptions.PageHeight = cadImage.Height;
                rasterizationOptions.DrawType = Aspose.CAD.FileFormats.Cad.CadDrawTypeMode.UseDrawColor;
                rasterizationOptions.Layouts = layoutNameList.ToArray();
                jpgOptions.VectorRasterizationOptions = rasterizationOptions;
                jpgOptions.Quality = 100;
                cadImage.Save("test20230420.jpg", jpgOptions);
            }
        }

@yokomichi,
レイアウト上のエンティティの数を自分で分析し、空でないレイアウトを別のファイルにエクスポートすることができます:

List<string> allLayouts = cadImage.Layouts.KeysTyped.ToList();

// one way to detect quantity of entities in layouts
foreach (string blockName in cadImage.BlockEntities.KeysTyped)
{
	if (ModelOrSpace(blockName))
	{
		foreach (CadBlockTableObject tableObject in cadImage.BlocksTables)
		{
			if (tableObject.BlockName == blockName)
			{
				foreach (CadLayout layout in cadImage.Layouts.Values)
				{
					if (tableObject.HardPointerToLayout == layout.ObjectHandle || layout.BlockTableRecordHandle == tableObject.ObjectHandle)
					{
						if (cadImage.BlockEntities[blockName].Entities.Length == 0)
						{
							allLayouts.Remove(layout.LayoutName);
						}
					}
				}
				break;
			}
		}
	}
}

CadRasterizationOptions rasterizationOptions = new CadRasterizationOptions();
...
// set your options

foreach (string layoutName in allLayouts)
{
	rasterizationOptions.Layouts = new string[] { layoutName };

	JpegOptions jpegOptions = new JpegOptions();
	
	// set your jpeg options
	...
	
	jpegOptions.VectorRasterizationOptions = rasterizationOptions;
	cadImage.Save(layoutName + ".jpeg", jpegOptions);
}


private bool ModelOrSpace(string blockName)
{
	string modelSpace = "*MODEL_SPACE";
	if (blockName.ToUpperInvariant() == modelSpace)
	{
		return true;
	}

	string paperSpace = "*PAPER_SPACE";
	if (blockName.ToUpperInvariant().StartsWith(paperSpace))
	{
		return true;
	}

	return false;
}

@yokomichi,
Draft Document1.dwg と Draft Document4.dwg のレイアウトと同じ問題ですか? または、他の何か?

はい。同じ問題です。
TIFとPDFは1ファイルに複数のモデルとレイアウトを出力できるので問題がなかったのですが、
JPGは1ファイルにつき単一のモデル/レイアウトしか持てないため問題になりました。

空のレイアウトを識別する方法を教えていただいたので
無事解決できました。ありがとうございます。

@yokomichi,
喜んでお手伝いさせていただきました :slight_smile: