Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Font path #453

Merged
merged 20 commits into from
Oct 14, 2020
Merged

Font path #453

merged 20 commits into from
Oct 14, 2020

Conversation

cactrot
Copy link
Contributor

@cactrot cactrot commented Sep 21, 2020

Add the ability to specify a file path for the font.

Implements #198

Add the option to specify a path to the font.
Add the option to specify a path to the font.
Fixed argument name mismatch.
Fix inconsistent tabs and spaces
Change whitespace to try and pass automated checks.
Adding a space between comment and function call :/
@codecov
Copy link

codecov bot commented Sep 22, 2020

Codecov Report

Merging #453 into master will increase coverage by 0.02%.
The diff coverage is 100.00%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master     #453      +/-   ##
==========================================
+ Coverage   93.61%   93.64%   +0.02%     
==========================================
  Files          25       30       +5     
  Lines        5326     5868     +542     
  Branches      554      625      +71     
==========================================
+ Hits         4986     5495     +509     
- Misses        215      234      +19     
- Partials      125      139      +14     
Impacted Files Coverage Δ
cadquery/cq.py 88.27% <100.00%> (+0.21%) ⬆️
cadquery/occ_impl/shapes.py 90.94% <100.00%> (+0.18%) ⬆️
tests/test_cadquery.py 98.99% <100.00%> (+0.01%) ⬆️
cadquery/__init__.py 100.00% <0.00%> (ø)
tests/test_exporters.py 100.00% <0.00%> (ø)
cadquery/occ_impl/solver.py 89.90% <0.00%> (ø)
cadquery/assembly.py 88.43% <0.00%> (ø)
tests/test_assembly.py 100.00% <0.00%> (ø)
cadquery/occ_impl/exporters/assembly.py 100.00% <0.00%> (ø)
cadquery/occ_impl/assembly.py 95.06% <0.00%> (ø)
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 2d721d0...a947d0b. Read the comment docs.

Add test for "text" using fontPath keyword argument.
Trying Unix style path.
Try just the current directory.
Try pulling a valid path from elsewhere in the file.
Perhaps the call to os.path.join will allow the tests to run.
@cactrot
Copy link
Contributor Author

cactrot commented Sep 23, 2020

The implementation works on my machine. And I haven't been able reproduce the segfault at https://github.com/cactrot/cadquery/blob/00a1329c2ef7a17e94566a6a330780af05098483/tests/test_cadquery.py#L2746 on my machine. Not sure how to proceed, so I guess this is stalled for now.

@adam-urbanczyk
Copy link
Member

Thanks for the contribution @cactrot ! The segfault is reproducible across different platforms, so there is something systematic happening. Are you sure that the file Sans.ttf exists in the test environment?

Backtrace for future ref:

tests/test_cadquery.py::TestCadQuery::testText Fatal Python error: Segmentation fault

Current thread 0x00007fffb787c380 (most recent call first):

  File "/Users/travis/build/CadQuery/cadquery/cadquery/occ_impl/shapes.py", line 2405 in makeText

  File "/Users/travis/build/CadQuery/cadquery/cadquery/cq.py", line 3579 in text

  File "/Users/travis/build/CadQuery/cadquery/tests/test_cadquery.py", line 2765 in testText

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/unittest/case.py", line 605 in run

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/unittest/case.py", line 653 in __call__

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/unittest.py", line 278 in runtest

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/runner.py", line 153 in pytest_runtest_call

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/callers.py", line 187 in _multicall

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/manager.py", line 87 in <lambda>

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/manager.py", line 93 in _hookexec

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/hooks.py", line 286 in __call__

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/runner.py", line 247 in <lambda>

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/runner.py", line 294 in from_call

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/runner.py", line 247 in call_runtest_hook

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/runner.py", line 207 in call_and_report

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/runner.py", line 117 in runtestprotocol

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/runner.py", line 100 in pytest_runtest_protocol

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/callers.py", line 187 in _multicall

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/manager.py", line 87 in <lambda>

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/manager.py", line 93 in _hookexec

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/hooks.py", line 286 in __call__

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/main.py", line 321 in pytest_runtestloop

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/callers.py", line 187 in _multicall

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/manager.py", line 87 in <lambda>

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/manager.py", line 93 in _hookexec

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/hooks.py", line 286 in __call__

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/main.py", line 296 in _main

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/main.py", line 240 in wrap_session

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/main.py", line 289 in pytest_cmdline_main

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/callers.py", line 187 in _multicall

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/manager.py", line 87 in <lambda>

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/manager.py", line 93 in _hookexec

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/pluggy/hooks.py", line 286 in __call__

  File "/Users/travis/miniconda/envs/cadquery/lib/python3.6/site-packages/_pytest/config/__init__.py", line 158 in main

  File "/Users/travis/miniconda/envs/cadquery/bin/pytest", line 11 in <module>

/Users/travis/.travis/functions: line 109:  3558 Segmentation fault: 11  (core dumped) pytest -v --cov

The command "pytest -v --cov" exited with 139.

after_failure.1

0.03s$ ls /cores/core.*
after_failure.2

152.21s$ lldb --core `ls /cores/core.*` --batch --one-line "bt"

(lldb) target create --core "/cores/core.3558"

warning: (x86_64) /cores/core.3558 load command 691 LC_SEGMENT_64 has a fileoff + filesize (0xa2ec0000) that extends beyond the end of the file (0xa2ebf000), the segment will be truncated to match

warning: (x86_64) /cores/core.3558 load command 692 LC_SEGMENT_64 has a fileoff (0xa2ec0000) that extends beyond the end of the file (0xa2ebf000), ignoring this section

Core file '/cores/core.3558' (x86_64) was loaded.

(lldb) bt

* thread #1, stop reason = signal SIGSTOP

  * frame #0: 0x00007fff7f1e5b66 libsystem_kernel.dylib`__pthread_kill + 10

    frame #1: 0x00007fff7f3b0080 libsystem_pthread.dylib`pthread_kill + 333

    frame #2: 0x00007fff7f0f36fe libsystem_c.dylib`raise + 26

    frame #3: 0x00007fff7f3a3f5a libsystem_platform.dylib`_sigtramp + 26

    frame #4: 0x0000000157d2d6d9 libTKService.7.4.0.dylib`Font_FTFont::Ascender() const + 9

    frame #5: 0x0000000157d2e92f libTKService.7.4.0.dylib`Font_TextFormatter::Append(NCollection_UtfString<char> const&, Font_FTFont&) + 63

    frame #6: 0x0000000157d25e87 libTKService.7.4.0.dylib`Font_BRepTextBuilder::Perform(Font_BRepFont&, NCollection_UtfString<char> const&, gp_Ax3 const&, Graphic3d_HorizontalTextAlignment, Graphic3d_VerticalTextAlignment) + 119

    frame #7: 0x000000010cff3758 OCP.cpython-36m-darwin.so`register_Font(pybind11::module&)::$_0::operator()(Font_BRepTextBuilder&, char const*, double, Font_FontAspect, char const*) const + 296

    frame #8: 0x000000010cff3614 OCP.cpython-36m-darwin.so`TopoDS_Shape pybind11::detail::argument_loader<Font_BRepTextBuilder&, char const*, double, Font_FontAspect, char const*>::call_impl<TopoDS_Shape, register_Font(pybind11::module&)::$_0&, 0ul, 1ul, 2ul, 3ul, 4ul, pybind11::detail::void_type>(register_Font(pybind11::module&)::$_0&&&, std::__1::integer_sequence<unsigned long, 0ul, 1ul, 2ul, 3ul, 4ul>, pybind11::detail::void_type&&) + 244

    frame #9: 0x000000010cff2e3f OCP.cpython-36m-darwin.so`std::__1::enable_if<!(std::is_void<TopoDS_Shape>::value), TopoDS_Shape>::type pybind11::detail::argument_loader<Font_BRepTextBuilder&, char const*, double, Font_FontAspect, char const*>::call<TopoDS_Shape, pybind11::detail::void_type, register_Font(pybind11::module&)::$_0&>(register_Font(pybind11::module&)::$_0&&&) + 79

    frame #10: 0x000000010cff2bd2 OCP.cpython-36m-darwin.so`void pybind11::cpp_function::initialize<register_Font(pybind11::module&)::$_0, TopoDS_Shape, Font_BRepTextBuilder&, char const*, double, Font_FontAspect, char const*, pybind11::name, pybind11::is_method, pybind11::sibling, char [27], pybind11::arg, pybind11::arg, pybind11::arg, pybind11::arg>(register_Font(pybind11::module&)::$_0&&, TopoDS_Shape (*)(Font_BRepTextBuilder&, char const*, double, Font_FontAspect, char const*), pybind11::name const&, pybind11::is_method const&, pybind11::sibling const&, char const (&) [27], pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&)::'lambda'(pybind11::detail::function_call&)::operator()(pybind11::detail::function_call&) const + 258

    frame #11: 0x000000010cff2ab5 OCP.cpython-36m-darwin.so`void pybind11::cpp_function::initialize<register_Font(pybind11::module&)::$_0, TopoDS_Shape, Font_BRepTextBuilder&, char const*, double, Font_FontAspect, char const*, pybind11::name, pybind11::is_method, pybind11::sibling, char [27], pybind11::arg, pybind11::arg, pybind11::arg, pybind11::arg>(register_Font(pybind11::module&)::$_0&&, TopoDS_Shape (*)(Font_BRepTextBuilder&, char const*, double, Font_FontAspect, char const*), pybind11::name const&, pybind11::is_method const&, pybind11::sibling const&, char const (&) [27], pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&)::'lambda'(pybind11::detail::function_call&)::__invoke(pybind11::detail::function_call&) + 21

    frame #12: 0x0000000109bf51e7 OCP.cpython-36m-darwin.so`pybind11::cpp_function::dispatcher(_object*, _object*, _object*) + 3863

    frame #13: 0x00000001068d75f7 python`_PyCFunction_FastCallDict + 391


...

Add font for testing makeText
Changed directory to point to test data.
@cactrot
Copy link
Contributor Author

cactrot commented Sep 24, 2020

Hoping https://fonts.google.com/specimen/Open+Sans#license is a reasonable choice for test data.

@adam-urbanczyk
Copy link
Member

OK, that's progress! Is some safety check for situations when the font is not found?

@cactrot
Copy link
Contributor Author

cactrot commented Sep 24, 2020

https://github.com/tpaviot/pythonocc-core/blob/bb5fdd1ec108bc6f5c773f7088453eb99683290f/src/Addons/Font3d.cpp#L56

It looks like the underlying implementation is already trying to do that.

I suppose "os.path.exists" before the call might be a quick fix.

Or, catching segfault with the "signal" module.

@adam-urbanczyk
Copy link
Member

We are not using PythonOCC anymore, but rather our own binding (OCP). It looks like a CheckFont call should be added somewhere.

Check for non-existent file instead of trying to use it and possibly segfaulting.
Check for non-existent file instead of trying to use it and possibly segfaulting.
Fix type mismatch.
Code from PyOCC expected non-implemented function.
Inverted logic
@cactrot
Copy link
Contributor Author

cactrot commented Sep 30, 2020

I added a call to check_font before trying to use the file and coverage tests for a real and non-existent file.

@adam-urbanczyk adam-urbanczyk self-requested a review October 10, 2020 17:36
Use name based on the path for registering
@adam-urbanczyk
Copy link
Member

@cactrot I reworked the font registration a bit - custom fonts use the path as their name now. Could you check if it still works well for you? As far as I can tell, this approach does work and will not overwrite existing fonts by accident.

@cactrot
Copy link
Contributor Author

cactrot commented Oct 13, 2020

Just pulled the changes and ran the code. Still appears to work well for me.

Copy link
Member

@jmwright jmwright left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added one question related to using the tempfile module because I've been bitten before when not using that, but otherwise this PR looks good. I appreciate the contribution @cactrot

tests/test_cadquery.py Show resolved Hide resolved
@jmwright
Copy link
Member

Thanks again @cactrot ! Merging now since Adam has already approved.

@jmwright jmwright merged commit 3a50edd into CadQuery:master Oct 14, 2020
@cactrot cactrot deleted the fontPath branch October 14, 2020 15:42
@adam-urbanczyk
Copy link
Member

Thanks for the contribution @cactrot !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants