Anonymous
Как преобразовать серые элементы в черные в SVG, сгенерированные из DXF, сгенерированного USIGN EZDXF
Сообщение
Anonymous » 01 апр 2025, 16:09
Код: Выделить всё
import logging
import re
import xml.etree.ElementTree as ET
from ezdxf.addons.drawing import Frontend, RenderContext, svg, layout, config
import ezdxf
class ImageGenerator:
def __init__(self, doc) -> None:
self.doc = doc
self.logger = logging.getLogger(self.__class__.__name__)
self.phase_regex_pattern = r"~PHASE_\d+/\d+"
for block in doc.blocks:
for entity in block:
if entity.dxftype() == "MTEXT" and not re.match(self.phase_regex_pattern, entity.dxf.text):
plain_text = entity.plain_text(fast=False).strip()
# Check for EPACK in cleaned text (case-insensitive)
# if "EPACK" in plain_text.upper():
# print(f"Found EPACK text: {plain_text}")
# Add any additional processing here
# Example: Add a border to EPACK text (optional)
# entity.dxf.frame = 1 # Uncomment to add border
entity.dxf.text = entity.dxf.text.replace('\n', '\\P') # Use DXF paragraph marker
entity.dxf.char_height *= 1 # Adjust as needed
def generate_image_of_block(self, block_name, width, height, lineweight):
filter_value = "grayscale(100%) contrast(100%) invert(100%) saturate(200%) "
# filter_value = "grayscale(100%) brightness(70%) contrast(50) invert(1)"
# filter_value = "invert(1) brightness(-50%) contrast(300%)"
block = self.doc.blocks.get(block_name)
if block.name.startswith("mark_"):
context = RenderContext(doc=self.doc)
backend = svg.SVGBackend()
cfg = config.Configuration(
lineweight_scaling=lineweight,
background_policy=config.BackgroundPolicy.WHITE,
color_policy=config.ColorPolicy.COLOR,
lineweight_policy=config.LineweightPolicy.ABSOLUTE,
)
frontend = Frontend(context, backend, config=cfg)
frontend.draw_entities(block)
page = layout.Page(
width, height, layout.Units.px, margins=layout.Margins.all(20)
)
svg_string = backend.get_string(page)
svg_string = apply_css_filter(svg_string, filter_value)
self.logger.info("Image string successfully generated")
return svg_string
def apply_css_filter(svg_str, filter_value):
try:
root = ET.fromstring(svg_str)
except Exception as e:
print("Error parsing SVG:", e)
return svg_str
#remove a previous filter if present.
style = root.attrib.get("style", "")
style = re.sub(r"filter\s*:\s*[^;]+;", "", style)
style += f"filter: {filter_value};"
root.attrib["style"] = style
return ET.tostring(root, encoding="unicode")
if __name__ == "__main__":
# Uncomment the next line to enable dark mode:
isDarkMode = True
# isDarkMode = False
filter_value = "grayscale(100%) contrast(100%) invert(100%) saturate(200%)" if isDarkMode else "none"
# filter_value = "grayscale(100%) invert(1) brightness(0) contrast(200%)" if isDarkMode else "none"
doc = ezdxf.readfile("epack_test_files/RMC1.dxf")
ig = ImageGenerator(doc)
for block in doc.blocks:
if block.name.startswith("mark_"):
svg_str = ig.generate_image_of_block(block.name, 1920, 1080, 2)
# svg_str = apply_css_filter(svg_str, filter_value)
# svg_str = add_text_padding(svg_str, padding=20) # Add this line
with open(f"{block.name}.svg", "w", encoding="utf-8") as f:
f.write(svg_str)
print(f"Image of {block.name} generated successfully")
< /code>
Я работаю над сценарием Python, чтобы генерировать изображения SVG из файлов DXF с использованием библиотеки EZDXF. Я намерен убедиться, что все элементы, в том числе серые, выглядят черными в результирующем изображении SVG.grayscale(100%) contrast(100%) invert(100%) saturate(200%)
Код: Выделить всё
grayscale(100%) invert(1) brightness(0) contrast(200%)
Несмотря на то, что они пробовали разные фильтры, серые элементы до сих пор не преобразуются в черный в сгенерированном svg.
Приложения:
. /> < /li>
< /ul>
Подробнее здесь:
https://stackoverflow.com/questions/795 ... ated-usign
1743512966
Anonymous
[code]import logging import re import xml.etree.ElementTree as ET from ezdxf.addons.drawing import Frontend, RenderContext, svg, layout, config import ezdxf class ImageGenerator: def __init__(self, doc) -> None: self.doc = doc self.logger = logging.getLogger(self.__class__.__name__) self.phase_regex_pattern = r"~PHASE_\d+/\d+" for block in doc.blocks: for entity in block: if entity.dxftype() == "MTEXT" and not re.match(self.phase_regex_pattern, entity.dxf.text): plain_text = entity.plain_text(fast=False).strip() # Check for EPACK in cleaned text (case-insensitive) # if "EPACK" in plain_text.upper(): # print(f"Found EPACK text: {plain_text}") # Add any additional processing here # Example: Add a border to EPACK text (optional) # entity.dxf.frame = 1 # Uncomment to add border entity.dxf.text = entity.dxf.text.replace('\n', '\\P') # Use DXF paragraph marker entity.dxf.char_height *= 1 # Adjust as needed def generate_image_of_block(self, block_name, width, height, lineweight): filter_value = "grayscale(100%) contrast(100%) invert(100%) saturate(200%) " # filter_value = "grayscale(100%) brightness(70%) contrast(50) invert(1)" # filter_value = "invert(1) brightness(-50%) contrast(300%)" block = self.doc.blocks.get(block_name) if block.name.startswith("mark_"): context = RenderContext(doc=self.doc) backend = svg.SVGBackend() cfg = config.Configuration( lineweight_scaling=lineweight, background_policy=config.BackgroundPolicy.WHITE, color_policy=config.ColorPolicy.COLOR, lineweight_policy=config.LineweightPolicy.ABSOLUTE, ) frontend = Frontend(context, backend, config=cfg) frontend.draw_entities(block) page = layout.Page( width, height, layout.Units.px, margins=layout.Margins.all(20) ) svg_string = backend.get_string(page) svg_string = apply_css_filter(svg_string, filter_value) self.logger.info("Image string successfully generated") return svg_string def apply_css_filter(svg_str, filter_value): try: root = ET.fromstring(svg_str) except Exception as e: print("Error parsing SVG:", e) return svg_str #remove a previous filter if present. style = root.attrib.get("style", "") style = re.sub(r"filter\s*:\s*[^;]+;", "", style) style += f"filter: {filter_value};" root.attrib["style"] = style return ET.tostring(root, encoding="unicode") if __name__ == "__main__": # Uncomment the next line to enable dark mode: isDarkMode = True # isDarkMode = False filter_value = "grayscale(100%) contrast(100%) invert(100%) saturate(200%)" if isDarkMode else "none" # filter_value = "grayscale(100%) invert(1) brightness(0) contrast(200%)" if isDarkMode else "none" doc = ezdxf.readfile("epack_test_files/RMC1.dxf") ig = ImageGenerator(doc) for block in doc.blocks: if block.name.startswith("mark_"): svg_str = ig.generate_image_of_block(block.name, 1920, 1080, 2) # svg_str = apply_css_filter(svg_str, filter_value) # svg_str = add_text_padding(svg_str, padding=20) # Add this line with open(f"{block.name}.svg", "w", encoding="utf-8") as f: f.write(svg_str) print(f"Image of {block.name} generated successfully") < /code> Я работаю над сценарием Python, чтобы генерировать изображения SVG из файлов DXF с использованием библиотеки EZDXF. Я намерен убедиться, что все элементы, в том числе серые, выглядят черными в результирующем изображении SVG.grayscale(100%) contrast(100%) invert(100%) saturate(200%)[/code] [code]invert(1) brightness(-50%) contrast(300%)[/code] [code]grayscale(100%) invert(1) brightness(0) contrast(200%)[/code] Несмотря на то, что они пробовали разные фильтры, серые элементы до сих пор не преобразуются в черный в сгенерированном svg. Приложения: . /> < /li> < /ul> Подробнее здесь: [url]https://stackoverflow.com/questions/79548172/how-to-convert-grey-elements-to-black-in-svg-generated-from-dxf-generated-usign[/url]